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

标签 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 迁移框架并将 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 应用程序实际上是第 3 方可执行文件的插件 DLL。)

感谢所有帮助。谢谢。

最佳答案

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

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

关于c++ - 无法在 MFC 应用程序中显示模态 QProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510495/

相关文章:

c++ - 如何获取PRO文件中的目标目录

c++ - 编译时错误 : expected constructor, 析构函数或转换

java - 如何切换 Eclipse 视角?

c++ - 如何一起使用Opencv、qt creator、ming gw windows?

c++ - Qt程序不检测库

C++,复制构造函数在字符数组中不能正常工作

c++ - 为什么不同cpp文件中的类的重复定义可以无错误地链接?

java - 从非 Qt DLL (JNA) 使用 QTimer

c++ - MFC 对话框中的 QWinWidget 不重新绘制或响应 Tab/箭头键