相关疑难解决方法(0)

DLL中的Qt GUI环境(VST插件)

我想使用Qt GUI库作为VST插件的用户界面.VST插件是Windows上的DLL.宿主应用程序调用DLL上的各种函数,包括类似的东西openGUI().

我想知道如何从DLL使用Qt GUI; 我做了一些研究来研究可能的选择,但我不完全确定这些限制.

主要问题是在哪里创建QApplication对象并对其进行调用exec()(这是一个在应用程序退出之前不会返回的函数).

我已经看过这篇文章中给出的解决方案了,但是经过进一步的阅读,看起来这个解决方案在Mac OS X上不起作用,因为Cocoa对GUI可以运行的特定线程更具限制性.这真是一个黑客攻击.

我也看过这个解决方案,但依赖于它,QMfcApp并且QWinWindow它似乎不再是Qt库的一部分.

这是我的DLL生成一个新的应用程序本身的唯一方法吗?据推测,我可以通过调用QProcess并使用一些共享内存在GUI应用程序和我的VST DLL之间共享来启动一个?有没有人遇到过这类问题?我是否会走这条路,或者有什么我还没想到的?

更新

经过进一步研究,我遇到了QAbstractEventDispatcher全班同学.我看过这篇文章似乎说可以QApplication::processEvents()从你自己(我的插件的主机)调用事件循环而不是调用QApplication::exec().有没有人试过这样做?

c++ dll user-interface qt vst

17
推荐指数
1
解决办法
5034
查看次数

如何在不同的QT线程中创建窗口?

我有一个应用程序,其中每个线程(主线程除外)需要创建自己的窗口.我尝试创建一个线程,然后调用this->exec()run函数.但是,在我接到电话之前,我收到了一个错误:ASSERT failure in QWidget: "Widgets must be created in the GUI thread."

我想弹出一个消息窗口.问题是源有多个线程,每个线程可能需要弹出自己的消息.

c++ user-interface qt multithreading

16
推荐指数
2
解决办法
2万
查看次数

Windows消息循环而不是QApplication :: exec()/ QApplication :: processEvents()

Qt如果我QApplication::exec()用标准的Windows消息循环实现代替,我会错过任何功能吗?这应该澄清我的意思:

用于运行事件处理的因果"Qt"方式:

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Window w;
 w.show();
 return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

"Windows"方式运行事件处理:

#include <Windows.h>

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Window w;
 w.show();

 MSG msg;
 while(GetMessage(&msg, 0, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }

 return msg.wParam;
}
Run Code Online (Sandbox Code Playgroud)

上面演示了关于QApplication实例的外部消息循环,而QApplication实例本身甚至根本没有自己的事件循环.

换句话说,如果我有main.exe消息循环的程序(对Qt一无所知).dllQApplication内部的Qt GUI和实例,是否可以让外部消息循环main.exe来处理Qt GUI的事件?提前致谢!

编辑1: 我只是回答我自己的情况下,它是有用的人:我们有.NET下的C#编写的一个主要的.exe模块运行事件循环处理,我们有一对夫妇写的Qt/C++具有.DLL文件的GUI"内部"(以及共享的QApplication实例).永远不会调用QApplication :: exec(),但主.exe(.NET)模块的事件循环会成功调度所有事件,并且所有Qt函数都存在(信号/插槽,线程等)

编辑2: 这适用于Qt 4.8.2,但对于Qt 5.1.0,情况有点不同.现在你必须调用QApplication :: processEvents()一次,因为它在第一次调用时执行一些初始化初始化(在GetMessage或PeekMessage上安装WindowsHook).之后,无论谁在你的应用程序中调用GetMessage,Qt事件都会获得进程并且你是金色的:)

c++ qt

12
推荐指数
1
解决办法
2829
查看次数

将Qt GUI添加到动态库

问候溢出.我正在尝试将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不安全的原因是什么?为什么?"

c++ dll user-interface qt

3
推荐指数
1
解决办法
5819
查看次数

标签 统计

c++ ×4

qt ×4

user-interface ×3

dll ×2

multithreading ×1

vst ×1