添加Qt的图形用户界面的动态库(Adding a Qt GUI to a Dynamic Libra

2019-07-29 07:44发布

问候overflowers。 我想一个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的图形用户界面是不安全的,为什么情况?

Answer 1:

您可以从一个DLL使用Qt的GUI或使得从非Qt应用程序调用,但它不能从辅助线程,它必须在主线程中运行。 并且应用程序事件循环通过当GUI被关闭了,它返回一个阻塞方法开始,因此,如果您需要有逻辑在您的应用程序独立于GUI的运行,那么这个逻辑就需要在辅助线程中运行。

如果你觉得雄心勃勃,你可以修改,这样你可以从你的调用应用程序管理事件循环的方式QCoreApplication和QEventLoop类,它可能就不会那么困难。 但据我所知,没有办法使用Qt做开箱。



Answer 2:

Consideing杰拉德的回答,我可能会建议其最好保持CLI(您的应用程序)从您的应用程序界面(ERGO,一个单独的应用程序)分开。

让你的GUI应用程序使用CLI在后台。 它很容易使用QProcess中完成的。

干杯!



文章来源: Adding a Qt GUI to a Dynamic Library