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

ohtdti5x  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(168)

我对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";
}

我期望程序在启动后一秒打印“timeout called”。不幸的是,这不起作用。当调用QTimer::singleShot()时,控制台会说:

Object::connect: No such slot QApplication::timeout() in [path to the main.cpp file]
Object::connect:  (receiver name: 'QtTests')

我不知道该怎么办。

9w11ddsr

9w11ddsr1#

您只是在TestApp类中缺少了Q_OBJECT宏:

class TestApp: public QApplication {
    Q_OBJECT

    public:
    ...

这对于整个信号/插槽基础设施的工作是必要的(并且从具有此宏的类派生是不够的)。
(Make确保在更改后执行完整、干净构建-如果您不使用qmake或其他支持Qt的构建系统,则需要自己运行moc。)
参考QObject文档:
请注意,Q_OBJECT宏对于实现信号、插槽或属性的任何对象都是必需的。您还需要在源文件上运行 meta对象编译器。我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号、插槽和属性,因为如果不这样做,可能会导致某些函数表现出奇怪的行为。

vuktfyat

vuktfyat2#

你需要创建一个moc文件,如果你把Q_OBJECT宏放在你的类中,它是用qmake创建的。
因此,要修复您的示例,您需要将您的类更改为:

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

相关问题