1

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

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

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

所以我尝试安装 Qt/MFC 迁移框架并将 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 检索了句柄,并传入了窗口名称,为了使场景进一步复杂化,我的 MFC 应用程序实际上是第三方可执行文件的插件 DLL。)

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

4

1 回答 1

2

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

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

于 2010-12-22T18:53:34.377 回答