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

时间:2014-04-06 11:00:24

标签: c++ visual-studio qt qt-signals qcoreapplication

我有很多使用Qt的现有代码,更具体地说是Qt信号和插槽来定时特定的操作。

现在我需要在一个不是Qt应用程序的新应用程序中使用此代码(并且不能 - 我正在为visual studio编写插件)。无论如何 - 我如何让现有代码实际拦截信号并激活相关的插槽?

我是否需要以某种方式创建一个虚拟Qt应用程序?如果是这样 - 我如何使它处理信号而不成为我的其余代码的阻塞循环?

2 个答案:

答案 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 中的同步/数据复制。