C++ QTimer::singleShot()在给定对象';对象的父类,而不是对象本身

C++ QTimer::singleShot()在给定对象';对象的父类,而不是对象本身,c++,qt,inheritance,connect,signals-slots,C++,Qt,Inheritance,Connect,Signals Slots,我对Qt是相当陌生的。我对现有的Qt应用程序做了一些简单的修改,但还没有从头创建任何应用程序。 我也没有太多的经验,在某些方面的C++一般(类继承等)。p> 我创建了一个新的基于代码::Blocks Qt4的项目,并稍微修改了模板。我添加了两个文件。 目前,该项目包含三个文件:main.cpp、app.h和app.cpp。 这是main.cpp的内容: #include <QTimer> #include "app.h" int main(int argc, char* argv

我对Qt是相当陌生的。我对现有的Qt应用程序做了一些简单的修改,但还没有从头创建任何应用程序。
我也没有太多的经验,在某些方面的C++一般(类继承等)。p> 我创建了一个新的基于代码::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();
}
#include "app.h"

#include <QDebug>

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

void TestApp::timeout() {
    qDebug() << "timeout called";
}

我不知道怎么处理这件事。提前感谢。

您只是缺少TestApp类中的
Q\u对象
宏:

class TestApp: public QApplication {
    Q_OBJECT

    public:
    ...
这是整个信号/插槽基础结构工作所必需的(从具有此宏的类派生是不够的)

(确保在更改后进行完整、干净的构建-如果不使用
qmake
或其他支持Qt的构建系统,则需要自己运行
moc
。)

如需参考,请参阅文档:

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


您需要创建一个moc文件,如果您将Q_对象宏放入类中,该文件将使用qmake创建

因此,要修复您的示例,您需要将类更改为:

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

+1感谢提及moc文件!在未调用Qmake时,将
Q_对象
放入类声明是不够的,例如在使用CMake构建时。@Melebius为此,您需要使用
QT4_WRAP\u CPP
,这样CMake将解析头并生成moc文件。
class TestApp: public QApplication {
    Q_OBJECT

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