Qt信号和继承问题

Pet*_*ete 12 inheritance qt subclass signals-slots

我对使用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和信号/插槽似乎并不了解继承等:我怎么能继承定义窗口小部件在其他地方并访问widget的信号?

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

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

ash*_*tch 10

我想问题是多重继承:

class matLinePlot : public QObject, public Plot3D
...
Run Code Online (Sandbox Code Playgroud)

我假设那Plot3D是一个子类QObject?在这种情况下,你应该这样做

class matLinePlot : public Plot3D
...
Run Code Online (Sandbox Code Playgroud)

代替.

  • 您发布的链接显示了如何使用.ui文件(由Qt Designer创建的文件)的示例.一个重要的区别是Ui :: CalculatorForm不是QObject的子类.从QObject(并使用多重继承)继承子类时的规则是,只有一个超类可以是QObject,并且QObject必须是继承的第一部分. (2认同)