无法在MFC应用程序中显示模态QProgressDialog

时间:2010-12-22 15:05:47

标签: c++ qt qt-mfc-migration

在从MFC应用程序启动Qt应用程序时,我在显示模态Qt对话框时遇到问题。具体来说,当我将其父级设置为QWinWidget实例时,QProgressDialog实例将不会显示在MFC应用程序中。这是我的问题更详细......

我的MFC应用程序需要将大量数据传输到Qt应用程序,这是一个DLL。 Qt应用程序在其API中包含ProgressDlg类,使用QProgressDialog实现幕后。必须在初始化Qt应用程序的事件循环之前创建和更新此对话框,以便MFC应用程序可以更新其进度(QApplication :: exec()帮助说这可以使用模态小部件)。

如果没有设置底层QProgressDialog的父级,进度条会按照我的预期更新,并且对话框在传输过程中保持响应,但我可以继续使用MFC应用程序。

所以我尝试安装Qt / MFC Migration Framework并将QProgressDialog的父级设置为QWinWidget:

void ProgressDlg::SetParent(HWND hParentWnd)
{
    QWinWidget* w = new QWinWidget(hParentWnd);
    m_impl->setParent(w);
}

(其中m_impl派生自QProgressDialog。)

然后在MFC端添加调用代码以创建对话框:

HWND hWnd = FindWindow(NULL, "ABC");
if(hWnd)
{
    ProgressDlg dlg;
    dlg.SetParent(hWnd);
    //...
    dlg.SetValue(0);
    //...
}

但是在设置父级时,不再显示QProgressDialog。 (我使用:: FindWindow检索句柄,传入Window Name,为了进一步使场景复杂化,我的MFC应用程序实际上是第三方可执行文件的插件DLL。)

所有帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

疑难杂症!问题是由对SetParent()的调用引起的。我需要在QProgressDialog之前创建QWinWidget,并将QWinWidget实例作为其父级传递给QProgressDialog的构造函数。

正如帮助所说,QWidget :: setParent重置窗口标志,因此对话框不再被识别为对话框。