0

我有一个 Mfc 应用程序,我想在其中打开一个 Qt 模式窗口,而 Mfc 应用程序仍在后面运行。

要从 Mfc 启动 Qt 应用程序,我知道了如何到那里。此页面创建了一个 Dll,但我的解决方案改为创建一个静态库

至于创建一个 Qt 模态窗口,后面运行主应用程序,看起来很容易

我的问题是看起来我无法将这两种解决方案结合起来。

以下代码启动 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,则此方法有效,但我更喜欢使用静态库)

4

1 回答 1

0

我没有阅读足够的演练

据说:“由于我们希望对话框是无模式的,我们不能在堆栈上创建 QWinWidget,因为它会在离开范围时被删除,并且它的所有子项(包括对话框)也会被删除。相反,我们在堆上创建 QWinWidget,使用 operator new "

因此,为了使我的窗口非模态,同时将控制权交还给主线程,我应该这样做:

void QtMfcFacade::startDevicesConfigurationWizard(HWND hWnd)
{
    QWinWidget *win = new QWinWidget( hWnd );
    win->showCentered();
    DevicesConfigurationWizard devicesConfigurationWizardUI = new DevicesConfigurationWizard (win);
    devicesConfigurationWizardUI->show();
}
于 2013-06-06T15:59:40.487 回答