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

Mik*_*haw 1 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
Run Code Online (Sandbox Code Playgroud)

The*_*ght 6

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

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

    public:
        MyClass(QObject* parent);
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

connect(myView, QMainView::test, myClassObj, MyClass::zoom);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第2和第4个参数是指向函数的指针.此外,还执行连接调用的运行时检查.你可以在这里阅读更多相关信息.