Visual Studio - 在非Qt应用程序中使用Qt的信号(C++)
visual studio - Using Qt's signals in a non Qt application (C++)
我有很多使用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 消息队列发出调用的目标。负责代理中的同步/数据复制。
相关文章:
- Qt 信号/插槽问题
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- C++Qt信号和插槽
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 使用std::bind将Qt信号连接到插槽
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 按钮组上的 Qt 信号未连接
- 通过排队的QT信号插槽连接发送QSHAREDPOINTERS的QVECTOR
- QT信号和插槽无法提供错误消息
- 如何监控Qt信号事件队列深度
- QT信号在虚拟机中不连接
- 为什么事件队列未处理我的QT信号
- 如何在打印机完成打印时从打印机获取Qt信号?
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- 删除 QObject 后 Qt 信号仍在触发
- Qt c++信号槽 - 清除信号所必需的
- 一个类中的QT信号/插槽,但从不同的线程发出
- QT:C 信号到QML连接
- 来自静态方法的QT信号