3

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

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

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

4

2 回答 2

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,但可以避免“阻塞”事件循环。但是,将代码从信号槽分层重新排列到直接调用可能会更简单,具体取决于您需要为发出的信号执行多少直接调用。

于 2014-04-06T11:08:11.557 回答
0

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

于 2021-07-07T23:16:32.877 回答