繁体   English   中英

将Qt GUI添加到动态库

[英]Adding a Qt GUI to a Dynamic Library

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

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

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

编辑1:

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

QApplication app(NULL, NULL);
window = new zGui;
window->show();
app.exec();

这里的问题是:是否可以与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);

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

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

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

考虑到Gerald的回答,我是否可以建议将CLI(您的应用程序)与您的应用程序GUI(ergo,一个单独的应用程序)分开更好。

使您的GUI应用程序在后台使用cli。 它很容易通过使用QProcess完成。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM