Qt无法将QGraphicsView信号的子类(未继承)连接到SLOT

时间:2014-04-10 10:49:08

标签: qt signals-slots qgraphicsview

我定义了类MyGraphicsView,它是QGraphicsView的子类。然后,我在MyGraphicsView中添加了一个信号test()。在我的MainWindow类中,我有MyGraphicsView * myView,我连接如下:

connect(myView,SIGNAL(test()),this,SLOT(zoom()));

但我得到了:

    QObject::connect: No such signal QGraphicsView::test() in ..\Proto_version_2\mainwindow.cpp:73

1 个答案:

答案 0 :(得分:6)

为了在类中使用槽和信号,它必须从QObject或QObject派生类派生,并且您的类必须包含Q_OBJECT宏

class MyClass : public QGraphicsView
{
    Q_OBJECT // Without this macro, signals and slots will not work

    public:
        MyClass(QObject* parent);
};

Q_OBJECT宏允许类使用QT的C ++扩展。正如文件所述: -

  

元对象编译器moc是处理Qt的C ++扩展的程序。   moc工具读取C ++头文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它将生成一个C ++源文件,其中包含这些类的元对象代码。除此之外,信号和插槽机制,运行时类型信息和动态属性系统都需要元对象代码。

但请注意,Qt 5提供了额外的连接调用,如果Q_OBJECT丢失则会发出警告: -

connect(myView, QMainView::test, myClassObj, MyClass::zoom);

在这种情况下,第二个和第四个参数是指向函数的指针。此外,还执行连接调用的运行时检查。您可以阅读有关此here的更多信息。