我有很多使用Qt的现有代码,更具体地说是Qt信号和插槽来定时特定的操作。
现在我需要在一个不是Qt应用程序的新应用程序中使用此代码(并且不能 - 我正在为visual studio编写插件)。无论如何 - 我如何让现有代码实际拦截信号并激活相关的插槽?
我是否需要以某种方式创建一个虚拟Qt应用程序?如果是这样 - 我如何使它处理信号而不成为我的其余代码的阻塞循环?
答案 0 :(得分:1)
似乎如果你写这样的东西,即使没有事件循环,仍会打印“测试”消息,所以这可能是一个线索:
#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,但你可以避免使用“阻塞”事件循环。但是,将信号槽分层中的代码重新排列为直接调用可能更简单,具体取决于您需要对发出的信号进行多少次直接调用。
答案 1 :(得分:0)
这是一起使用ASIO和Qt时的常见问题。我找到的解决方案是创建一个 Broker 对象,并在它们自己的线程上运行 Qt 和 ASIO 循环。 Broker 是对 ASIO 消息队列发出调用的目标,也是对 Qt 消息队列的发射器。处理 Broker 中的同步/数据复制。