QTimer:: singleShot () ищет указанный слот в родительском классе данного объекта, а не сам объект

Я довольно новичок в Qt. Я сделал несколько простых модификаций существующего приложения Qt,но я еще не создал их с нуля.
У меня также нет большого опыта работы с некоторыми аспектами C++ в целом (наследование классов и т. д.).

Я создал новый проект на основе Code::Blocks Qt4 и немного изменил шаблон. Я добавил два файла.
Сейчас проект содержит три файла: главная.cpp, app.h и app.СРР.
Это содержание из 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')

Я понятия не имею, как бороться с этим. Заранее спасибо.

2 ответов


вы просто пропускаете Q_OBJECT макрос в вашем классе TestApp:

class TestApp: public QApplication {
    Q_OBJECT

    public:
    ...

Это необходимо для работы всей инфраструктуры сигнала / слота (и вывод из класса, который имеет этот макрос, недостаточен).

(убедитесь, что вы сделать полную, чистую сборку после этого изменения, и если вы не используете qmake или какая-либо другая система сборки Qt-aware, вам нужно запустить moc себя.)

Для справки см. QObject docs:

обратите внимание, что макрос Q_OBJECT является обязательным для любого объекта, реализующего сигналы, слоты или свойства. Вам также необходимо запустить компилятор Meta Object в исходном файле. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject независимо от того, действительно ли они используют сигналы, слоты и свойства, поскольку неспособность сделать это может привести к тому, что некоторые функции покажут странное поведение.


вам нужно создать файл moc, который создается с помощью qmake, если вы поместите макрос Q_OBJECT в свой класс.

Итак, чтобы исправить ваш пример, вам нужно изменить свой класс на это:

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