1
votes

I'm having problems displaying a modal Qt dialog while starting up a Qt application from an MFC application. Specifically, a QProgressDialog instance won't display within the MFC application when I set its parent to a QWinWidget instance. Here's my problem in more detail...

My MFC application needs to transfer a lot of data over to the Qt application, which is a DLL. The Qt application includes a ProgressDlg class in its API that behind the scenes is implemented using a QProgressDialog. This dialog must be created and updated before the Qt application's event loop is initialised so that the MFC application can update its progress (The QApplication::exec() help says this is possible with modal widgets).

Without setting the underlying QProgressDialog's parent, the progress bar gets updated as I would expect and the dialog remains responsive during the transfer, but I can continue to interract with the MFC application.

So I tried installing the Qt/MFC Migration Framework and setting the QProgressDialog's parent to be a QWinWidget:

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

(where m_impl derives from QProgressDialog.)

And then adding the calling code on the MFC side to create the dialog:

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

However in setting the parent, the QProgressDialog no longer appears. (I retrieved the handle using ::FindWindow, passing in the Window Name, as to complicate the scenario further, my MFC application is actually a plugin DLL to a 3rd party executable.)

All help appreciated. Thanks.

1

1 Answers

2
votes

Gotcha! The problem was caused by the call to SetParent(). I needed to instead create the QWinWidget before the QProgressDialog and pass the QWinWidget instance in to the QProgressDialog's constructor as its parent.

As the help says, QWidget::setParent resets the window flags, so the dialog was no longer being recognised as a dialog.