问候溢出者。
我正在尝试将GUI添加到现有项目中。更具体地说,是作为.so
文件加载的插件(或者在win32上编译时.dll
)
该项目已经有自己的线程实现来处理可移植性。我知道Qt有自己的跨平台线程模型,但最好留在现有的线程模型中。
我向那些Qt退伍军人提出的问题[我刚开始阅读文档]是:如上所述,是否可以使用Qt将GUI嵌入到插件中?该插件已经是一个命令行界面,我希望GUI可选,即使它已编译。由于这些标准函数被主程序调用,GUI(我假设将存在于另一个线程中)将不得不可访问或能够调用方法,以便CLI线程可以共存,标准函数可以与两个接口的任何排列一起使用。
稍微玩了一下代码后,我可以从插件中启动一个简单的GUI。该插件已经是CLI,并具有从主程序调用的功能。我只是在初始化插件时创建了一个新线程,并从那里启动了阻塞GUI:
QApplication app(NULL, NULL);
window = new zGui;
window->show();
app.exec();
这里的问题是:是否可以与GUI通信或者从CLI线程访问GUI元素?
好吧,到目前为止,在一个单独的线程中启动阻塞GUI已经没有问题了。我也可以从主插件线程访问GUI中的小部件。据我所知,这种做法不仅仅是因为我到目前为止收到的答案,而且Qt库正在吐出一些关于另一个线程不安全访问的警告。
截至目前,我只在linux环境中工作,也许真正的问题将在其他系统上呈现。我只看到一个我无法肯定的故障是相关的:
更改进度条小部件的最大值和最小值后,进度条显示为空白。我可以通过以下
对此应用一个简单的修复程序//here is me setting the values
window->progressBar->setMaximum(character.maxHP);
window->progressBar_2->setMaximum(character.maxMP);
window->progressBar->setValue(character.curHP);
window->progressBar_2->setValue(character.curMP);
//and here is the fix
window->progressBar->setVisible(false);
window->progressBar->setVisible(true);
window->progressBar_2->setVisible(false);
window->progressBar_2->setVisible(true);
我想我的最后一个问题是'从其他线程访问Qt GUI的情况是什么特别不安全?为什么?'
答案 0 :(得分:5)
您可以使用从非Qt应用程序调用的dll中的Qt GUI,但它不能来自辅助线程,它必须在主线程中运行。应用程序事件循环通过阻塞方法启动,该方法在GUI关闭时返回,因此如果您需要在应用程序中运行独立于GUI的逻辑,那么该逻辑需要在辅助线程中运行
如果你有野心,你可以修改QCoreApplication和QEventLoop类,以便你可以从你的调用应用程序管理事件循环,它可能不会那么困难。但据我所知,开箱即用Qt无法做到这一点。
答案 1 :(得分:3)
考虑到Gerald的回答,我是否可以建议将CLI(您的应用程序)与您的应用程序GUI(ergo,一个单独的应用程序)分开更好。
让您的GUI应用程序在后台使用cli。它可以通过使用QProcess轻松完成。
喝彩!