我有一个Mfc应用程序,我想打开一个Qt模式窗口,而Mfc应用程序仍然在后面运行。
要从Mfc启动Qt应用程序,我得到了there的方法。此页面创建了一个Dll,但我的解决方案创建了一个静态库。
至于创建一个Qt模态窗口,后面运行主应用程序,它看起来像easy。
我的问题是看起来我无法将两种解决方案结合起来。
以下代码启动Qt窗口,但我强烈怀疑我阻止了我的主线程并且主线程无法接收事件。
void QtMfcFacade::startDevicesConfigurationWizard(HWND hWnd)
{
QWinWidget win( hWnd );
win.showCentered();
DevicesConfigurationWizard devicesConfigurationWizardUI(&win);
devicesConfigurationWizardUI.exec();
}
exec函数可能阻塞主线程
以下解决方案不应该阻止主线程,但Qt窗口只出现几毫秒而消失
void QtMfcFacade::startDevicesConfigurationWizard(HWND hWnd)
{
QWinWidget win( hWnd );
win.showCentered();
DevicesConfigurationWizard devicesConfigurationWizardUI(&win);
devicesConfigurationWizardUI.show();
}
所以,问题是,是否可以使用 show 函数代替 exec 函数?
(如果我正在创建一个Dll并从我的Mfc应用程序调用工作线程中的Dll,但我更喜欢使用静态库),这是有效的
答案 0 :(得分:0)
我没有阅读walkthough。
据说:“由于我们希望对话框无模式,我们无法在堆栈上创建QWinWidget,因为它在离开作用域时会被删除,并且它的所有子对象,包括对话框,都会被删除我们也删除了。我们使用operator new “
在堆上创建QWinWidget所以,为了让我的窗口非模态同时将控制权交还给主线程,我应该这样做:
void QtMfcFacade::startDevicesConfigurationWizard(HWND hWnd)
{
QWinWidget *win = new QWinWidget( hWnd );
win->showCentered();
DevicesConfigurationWizard devicesConfigurationWizardUI = new DevicesConfigurationWizard (win);
devicesConfigurationWizardUI->show();
}