QTimer::singleShot() 在给定对象的父类中查找指定的插槽,而不是对象本身
QTimer::singleShot() looks for the specified slot in the given object's parent class, not the object itself
我对Qt相当陌生,我对现有的Qt应用程序做了一些简单的修改,但我还没有从头开始创建任何应用程序。
我对c++的某些方面(类继承等)也没有太多的经验。
我创建了一个新的Code::Blocks Qt4-based项目,并修改了模板一点。我添加了两个文件。
目前该项目包含三个文件: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";
}
我希望程序输出&;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宏对于任何实现信号、槽或属性的对象都是强制性的。您还需要在源文件上运行Meta Object Compiler。我们强烈建议在QObject的所有子类中使用这个宏,不管它们是否实际使用信号、槽和属性,因为不这样做可能会导致某些函数表现出奇怪的行为。
您需要创建一个moc文件,如果您将Q_OBJECT宏放在类中,则使用qmake创建该文件。
因此,要修复您的示例,您需要将类更改为:
class TestApp: public QApplication {
Q_OBJECT
public:
TestApp(int &argc, char **argv);
public slots:
void timeout();
};
相关文章:
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- QObject::连接无法将信号连接到*this*对象的插槽
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- 在Qt中执行完所有插槽后,如何释放对象
- 使用信号和插槽连接多个 UI 对象
- 有没有办法调试排队等待对象的Qt插槽调用
- 不同类别的 2 个对象之间的信号/插槽
- 如何在没有对象的情况下执行插槽功能
- 两个对象QT之间的示例插槽/信号
- 有没有一种方法可以将升压信号和插槽与不可复制的对象一起使用
- 如果堆分配的对象被销毁并且指针被重新分配,Qt的信号和插槽系统会工作吗?
- QT对象::连接:没有此类插槽信号到线程插槽
- 将一个对象的所有QT信号动态映射到一个插槽
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- Qt:从一个对象发出相同的信号,但参数不同;插槽通过接收的参数进行区分
- 将返回对象的信号连接到没有参数的插槽
- 我应该怎么做才能使用自定义类对象的 QVector 将信号发送到插槽
- 将所有对象信号连接到单个插槽