![](/img/trans.png)
[英]What does QTimer::singleShot(0, object SLOT(obj_slot())) do?
[英]QTimer::singleShot() looks for the specified slot in the given object's parent class, not the object itself
我对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();
}
这就是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
这是app.cpp :
#include "app.h"
#include <QDebug>
TestApp::TestApp(int &argc, char **argv): QApplication(argc, argv) {
}
void TestApp::timeout() {
qDebug() << "timeout called";
}
我希望程序在启动后一秒打印“超时调用”。 不幸的是,这不起作用。 当调用QTimer::singleShot()
,控制台会说:
Object::connect: No such slot QApplication::timeout() in [path to the main.cpp file]
Object::connect: (receiver name: 'QtTests')
我不知道如何处理这个问题。 先感谢您。
您只是缺少TestApp类中的Q_OBJECT
宏:
class TestApp: public QApplication {
Q_OBJECT
public:
...
这对于整个信号/槽基础设施的工作是必要的(并且从具有该宏的类导出是不够的)。
(确保在更改后进行完整,干净的构建 - 如果您不使用qmake
或其他一些Qt感知构建系统,则需要自己运行moc
。)
有关参考,请参阅QObject
文档:
请注意,Q_OBJECT宏对于实现信号,槽或属性的任何对象都是必需的。 您还需要在源文件上运行元对象编译器。 我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号,插槽和属性,因为如果不这样做可能会导致某些函数出现奇怪的行为。
您需要创建一个moc文件,如果您在类中放置Q_OBJECT宏,则使用qmake创建该文件。
因此,要修复您的示例,您需要将您的类更改为:
class TestApp: public QApplication {
Q_OBJECT
public:
TestApp(int &argc, char **argv);
public slots:
void timeout();
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.