C++ QTimer::singleShot()在给定对象';对象的父类,而不是对象本身
我对Qt是相当陌生的。我对现有的Qt应用程序做了一些简单的修改,但还没有从头创建任何应用程序。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
我也没有太多的经验,在某些方面的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();
};