QTimer :: singleShot()在给定对象的父类中查找指定的槽,而不是对象本身

rhi*_*ino 8 c++ inheritance qt connect signals-slots

我对Qt相当新.我对现有的Qt应用程序做了一些简单的修改,但我还没有从头创建任何.
我对C++的某些方面(类继承等)也没有太多经验.

我创建了一个新的Code :: Blocks基于Qt4的项目,并对模板进行了一些修改.我添加了两个文件.
现在该项目包含三个文件:main.cpp,app.h和app.cpp.
这是main.cpp的内容:

#include <QTimer>

#include "app.h"

int main(int argc, char* argv[]) {
    TestApp app(argc, argv);

    QTimer::singleShot(1000, &app, SLOT(timeout()));

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

这就是app.h的样子:

#ifndef APP_H_INCLUDED
#define APP_H_INCLUDED

#include <QApplication>

class TestApp: public QApplication {
    public:
    TestApp(int &argc, char **argv);
    public slots:
    void timeout();
};

#endif
Run Code Online (Sandbox Code Playgroud)

这是app.cpp:

#include "app.h"

#include <QDebug>

TestApp::TestApp(int &argc, char **argv): QApplication(argc, argv) {
}

void TestApp::timeout() {
    qDebug() << "timeout called";
}
Run Code Online (Sandbox Code Playgroud)

我希望程序在启动后一秒打印"超时调用".不幸的是,这不起作用.当QTimer::singleShot()被调用时,控制台说:

Object::connect: No such slot QApplication::timeout() in [path to the main.cpp file]
Object::connect:  (receiver name: 'QtTests')
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个问题.先感谢您.

Mat*_*Mat 6

您只是错过了Q_OBJECTTestApp类中的宏:

class TestApp: public QApplication {
    Q_OBJECT

    public:
    ...
Run Code Online (Sandbox Code Playgroud)

这对于整个信号/槽基础设施的工作是必要的(并且从具有该宏的类导出是不够的).

(确保在更改后进行完整,干净的构建 - 如果您不使用qmake或其他一些Qt感知构建系统,您将需要moc自己运行.)

供参考,请参阅QObject文档:

请注意,Q_OBJECT宏对于实现信号,槽或属性的任何对象都是必需的.您还需要在源文件上运行元对象编译器.我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号,插槽和属性,因为如果不这样做可能会导致某些函数出现奇怪的行为.