У меня много существующего кода, использующего Qt, и более конкретно, сигналы и слоты Qt для конкретных действий по времени.
Теперь мне нужно использовать этот код в новом приложении, которое не является приложением Qt (и не может быть — я пишу плагин для Visual Studio). В любом случае — как я могу заставить существующий код фактически перехватывать сигналы и активировать соответствующие слоты?
Нужно ли как-то создавать фиктивное приложение Qt? Если так — как я могу заставить его обрабатывать сигналы, не превращаясь в блокирующий цикл для остальной части моего кода?
Кажется, что если вы напишите что-то вроде этого, сообщение «Test» все еще печатается, даже если нет никакого цикла событий, так что это может быть подсказка:
#include <QObject>
#include <QCoreApplication>
#include <QDebug>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent) : QObject(parent) {}
void testMethod() { emit testSignal(); }
signals:
void testSignal();
public slots:
void testSlot() { qDebug() << "Test"; }
};
#include "main.moc"
int main(int argc, char **argv)
{
// QCoreApplication coreApplication(argc, argv);
MyClass myObject(0);
QObject::connect(&myObject, SIGNAL(testSignal()), &myObject, SLOT(testSlot()));
myObject.testMethod();
// return coreApplication.exec();
return 0;
}
Таким образом, вам все равно понадобится Qt, но вы можете избежать «блокирующего» цикла событий. Однако может быть проще переставить код с многоуровневого сигнального слота на прямые вызовы, в зависимости от того, сколько прямых вызовов вам нужно сделать для испускаемого сигнала.
Других решений пока нет …