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



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

我没有充分阅读指南。

据说:"由于我们希望对话框是非模态的,我们不能在堆栈上创建QWinWidget,因为当它离开作用域时它将被删除,并且它的所有子节点,包括对话框,也将被删除。相反,我们在堆上创建QWinWidget,使用new"

操作符

所以,要使我的窗口非模态,同时把控制权交还给主线程,我应该这样做:

void QtMfcFacade::startDevicesConfigurationWizard(HWND hWnd)
{
    QWinWidget *win = new QWinWidget( hWnd );
    win->showCentered();
    DevicesConfigurationWizard devicesConfigurationWizardUI = new DevicesConfigurationWizard (win);
    devicesConfigurationWizardUI->show();
}

最新更新