c++ - 将 Qt GUI 添加到动态库

标签 c++ user-interface qt dll

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

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

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

编辑 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 无法开箱即用地做到这一点。

关于c++ - 将 Qt GUI 添加到动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048254/

相关文章:

javascript - 带有 html、css 和 js 的箭头按钮的水平导航栏

java - 运行方法两次

c++ - 数组作为数组 [n] 和指针数组*

Python GUI 回调函数

android - 尝试为 android 示例构建 OpenCV 时运行构建器 'CDT Builder' 时出错

python - PyQT 按钮在 QGridLayout 中的大小不正确

c++ - Qt5 QCustomPlot。实时大图

c++ - QDialog show() 跟随返回结果 Action

c++ - 在 C/C++ 中使用 popen() 是一种糟糕的编码习惯吗?

c++ - 用于提取存档文件的库