【问题标题】:Can't display modal QProgressDialog in MFC application无法在 MFC 应用程序中显示模态 QProgressDialog
【发布时间】:2010-12-22 15:05:46
【问题描述】:

从 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。)

感谢所有帮助。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多