首页 文章

Qt信号和继承问题

提问于
浏览
12

我对使用Qt进行编程相对较新,并且有一个问题 . 精简版:

如何继承超类中定义的信号?

我试图将其他人精心制作的QTWidgets子类化,以改变一些默认行为:

//Plot3D is a QWidget that defines a signal "rotationChanged"
class matLinePlot : public QObject, public Plot3D {

    Q_OBJECT;
        //etc...
public:
       //etc...

        //Catch Plot3D's signal "rotationChanged" and do some magic with it:
    void initPlot(){
              QObject::connect(this, SIGNAL(rotationChanged( double , double , double )),
            this, SLOT(myRotationChanged(double, double, double)));
    }
};

问题出在QObject :: connect行中 . 我想做的是将rotationChanged SIGNAL(从qwt3D_plot.h)连接到本地函数/ SLOT - “myRotationChanged” . 但是每当我这样做时,在运行时我得到:

Object :: connect:没有这样的信号matLinePlot :: rotationChanged(double,double,double)

在C:... \ matrixVisualization.h . 当然,我知道 rotationChanged 不在 matrixVisualization.h - 它在 qwt_plot3D.h ,但我认为,因为我从 Plot3D 继承,一切都应该没问题 . 但是,现在我考虑一下,因为SIGNAL和SLOT是宏,我假设MOC不知道/关心继承 .

这引出了我的问题 - 因为MOC和SIGNALS / SLOTS似乎不知道继承等:我如何将其他地方定义的窗口小部件子类化并访问窗口小部件的信号?

我有很多关于如何使用封装来完成这样的事情的例子,但是我害怕我不明白如何用继承来做这件事 .

对不起,如果这是一个荒谬的问题 - 我觉得我错过了一些明显的东西 .

4 回答

  • 2

    我想问题是多重继承:

    class matLinePlot : public QObject, public Plot3D
    ...
    

    我假设 Plot3DQObject 的子类?在这种情况下,你应该这样做

    class matLinePlot : public Plot3D
    ...
    

    代替 .

  • 0

    SIGNAL(x)和SLOT(x)是生成字符串文字的宏 . 在运行时,使用生成的文字的字符串比较来匹配插槽和信号 .

    (我会在mdec的评论中添加评论,但我没有足够的代表)

  • 1

    我相信如果Plot3D :: rotationChanged信号是公共的或受保护的,它将起作用 . 你确定信号不是私密的吗?

    Edit:

    虽然我找不到具体的参考,但我必须得出结论,信号总是公开的 . 至少我在这里做的测试似乎表明我可以连接到一个信号,即使它是在一个类的私有部分声明的 .

    我还验证了在QObject中声明的信号可以在connect语句中使用QObject的子类连接,因此信号肯定是可继承的 . 正如我在其他答案和评论中看到的那样,问题必须在其他地方 .

  • 10

    不正确 - >查看评论 .

    我在Uni使用Qtopia,我相信我记得有人在SIGNAL和SLOT参数中说了一些关于连接的间距 .

    尝试使用

    QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
                this, SLOT(myRotationChanged(double,double,double)));
    

    我知道这看起来并不直观,因为C对空白不敏感,但我相信这与Qtopia / QT在连接信号和插槽时所使用的一些魔力有关 . 这可能只适用于Qtopia,或者我可能听错了,但试一试 . 此外,信号是公共的还是受保护的,并且您是否包含了相应的头文件?

相关问题