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();
};