Visual Studio - 在非Qt应用程序中使用Qt的信号(C++)

visual studio - Using Qt's signals in a non Qt application (C++)

本文关键字:Qt 信号 C++ Studio 在非 应用程序 Visual      更新时间:2023-10-16

我有很多使用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,但可以避免出现"阻塞"事件循环。但是,将代码从信号槽分层重新排列为直接呼叫可能更简单,具体取决于您需要对发出的信号执行多少次直接呼叫。

这是同时使用 ASIO 和 Qt 时的常见问题。我找到的解决方案是创建一个 Broker 对象,并在它们自己的线程上运行 Qt 和 ASIO 循环。代理是向 ASIO 消息队列发出调用的目标,也是向 Qt 消息队列发出调用的目标。负责代理中的同步/数据复制。