将Qt GUI添加到动态库

C-o*_*r-E 3 c++ dll user-interface qt

问候溢出.我正在尝试将GUI添加到现有项目中.更具体地说,是作为.so文件加载的插件(或者在win32 a上编译时.dll)

该项目已经有自己的线程实现来处理可移植性.我知道Qt有自己的跨平台线程模型,但最好留在现有的线程模型中.

我对Qt老手的问题[我刚刚开始阅读文档]是:如上所述,是否可以使用Qt将GUI嵌入到插件中?该插件已经是一个命令行界面,我希望GUI可选,即使它已编译.由于这些标准函数被主程序调用,GUI(我假设将存在于另一个线程中)将不得不可访问或能够调用方法,以便CLI线程可以共存,标准函数可以与两个接口的任何排列一起使用.

编辑1:

在使用代码后,我可以从插件中启动一个简单的GUI.该插件已经是CLI,并具有从主程序调用的功能.我只是在初始化插件时创建了一个新线程,并从那里启动了阻塞GUI:

QApplication app(NULL, NULL);
window = new zGui;
window->show();
app.exec();
Run Code Online (Sandbox Code Playgroud)

这里的问题是:是否可以与GUI通信或者从CLI线程访问GUI元素?

编辑2:一些结果

好吧,到目前为止,在一个单独的线程中启动阻塞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);
Run Code Online (Sandbox Code Playgroud)

我想我的最后一个问题是"从其他线程访问Qt GUI不安全的原因是什么?为什么?"

Ger*_*ald 6

您可以使用从非Qt应用程序调用的dll中的Qt GUI,但它不能来自辅助线程,它必须在主线程中运行.应用程序事件循环通过阻塞方法启动,该方法在GUI关闭时返回,因此如果您需要在应用程序中运行独立于GUI的逻辑,那么该逻辑需要在辅助线程中运行.

如果您觉得有野心,可以修改QCoreApplication和QEventLoop类,以便您可以从调用应用程序管理事件循环,并且可能不会那么困难.但据我所知,开箱即用Qt无法做到这一点.