使用Mfc与Qt模态对话框和主进程

时间:2013-06-05 17:13:46

标签: qt mfc qt-mfc-migration

我有一个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,但我更喜欢使用静态库),这是有效的

1 个答案:

答案 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();
}