gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:42:26 28 4
gpt4 key购买 nike

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

我创建了一个新的基于 Code::Blocks Qt4 的项目并稍微修改了模板。我添加了两个文件。
目前该项目包含三个文件:main.cpp、app.h 和 app.cpp。
这是ma​​in.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文档:

Notice that the Q_OBJECT macro is mandatory for any object that implements signals, slots or properties. You also need to run the Meta Object Compiler on the source file. We strongly recommend the use of this macro in all subclasses of QObject regardless of whether or not they actually use signals, slots and properties, since failure to do so may lead certain functions to exhibit strange behavior.

关于c++ - QTimer::singleShot() 在给定对象的父类中查找指定的槽,而不是对象本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com