在从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。)
所有帮助表示赞赏。感谢。
答案 0 :(得分:2)
疑难杂症!问题是由对SetParent()的调用引起的。我需要在QProgressDialog之前创建QWinWidget,并将QWinWidget实例作为其父级传递给QProgressDialog的构造函数。
正如帮助所说,QWidget :: setParent重置窗口标志,因此对话框不再被识别为对话框。