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

3
我有很多使用Qt的现有代码,更具体地说是使用Qt信号和槽来定时执行特定操作。
现在我需要在一个不是Qt应用程序中使用这些代码(也不能是 - 我正在编写Visual Studio插件)。 无论如何 - 我该如何让现有代码拦截信号并激活相关的槽?
我需要创建一个虚拟的Qt应用程序吗? 如果是这样 - 如何使它处理信号而不成为阻塞其他代码的循环?

现在解决了吗? - László Papp
不幸的是,下面的代码对我没有帮助。由于完全不同的原因,我不得不把它放在一边,而且在不久的将来也无法回到它。所以,无法说明。 - Oren Sarid
2个回答

1
似乎,如果您编写类似以下内容的代码,则即使没有事件循环,“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,但可以避免使用“阻塞”事件循环。但是,根据发射的信号需要进行多少次直接调用,只需将代码从信号槽分层重新排列为直接调用可能更简单些。

1
不完全是,事件循环是用于排队连接的,但“直接”信号/槽机制更类似于.NET多播委托,并且与事件循环大多无关。 - Matteo Italia
@MatteoItalia:没错,我尝试了贴出的代码,它可以在没有事件循环的情况下正常工作。 - László Papp
显然,现有的代码具有在Qt应用程序中运行时完美工作的发射和连接。但是当我从另一个应用程序调用相同的功能时,我可以看到信号被发出(使用调试器),但相关的(已连接的)插槽未被激活。 - Oren Sarid
@user3503372:尝试一下我的代码,如果它能运行 - 对我来说是可以的 - 那么问题就在你未显示的代码中。 - László Papp
1
@OrenSarid:你问能否使用Qt,但接着又说你不能重写代码,必须保留Qt代码。我有点迷失了,抱歉。希望有人能帮助你。 - László Papp
显示剩余8条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接