12

我对使用 Qt 编程比较陌生,并且有一个问题。简洁版本:

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

我正在尝试继承其他人精心制作的 QTWidgets 以更改一些默认行为:

//Plot3D是一个QWidget,它定义了一个信号“rotationChanged”
类matLinePlot:公共QObject,公共Plot3D {

    Q_OBJECT;
        //ETC...
上市:
       //ETC...

        //捕捉 Plot3D 的信号“rotationChanged”并用它做一些魔术:
    无效初始化图(){
              QObject::connect(this, SIGNAL(rotationChanged( double , double , double )),
            这,SLOT(myRotationChanged(双,双,双)));
    }
};

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

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

在 C:...\matrixVisualization.h。当然,我知道那rotationChanged不是 in matrixVisualization.h- 它是 in qwt_plot3D.h,但我认为既然我继承了Plot3D一切应该没问题。但是,现在我想起来了,因为 SIGNAL 和 SLOT 是宏,我认为MOC不知道/不关心继承。

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

我有很多关于如何使用封装来完成这样的事情的例子,但恐怕我不明白如何用继承来做到这一点。

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

4

4 回答 4

10

我想问题是多重继承:

class matLinePlot : public QObject, public Plot3D
...

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

class matLinePlot : public Plot3D
...

反而。

于 2009-05-10T11:23:49.507 回答
2

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

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

于 2009-05-10T05:13:47.727 回答
1

我相信如果 Plot3D::rotationChanged 信号是公开的或受保护的,这将起作用。你确定信号不是私人的吗?

编辑:

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

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

于 2009-05-10T03:45:36.583 回答
0

不正确 -> 查看评论。

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

尝试使用

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

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

于 2009-05-10T04:50:25.163 回答