В общем, для диалога (или любого виджета) получаем виндовый HWND, после чего впихиваем его в имеющийся диалог методом 'HWND oldparent =SetParent( HWND child, HWND parent)'. После этого виджет становится дочерним окном стандартных виндусовских диалогов, в том числе MFC-шных (с точки зрения пользователя ведёт себя как обычный контрол диалога, т.е. визуальной разницы никакой, что и требовалось получить). Перед удалением диалога нужно для виджета вернуть родителя.
#include <QtGui/5.12.6/QtGui/qpa/qplatformnativeinterface.h>
QWindow * windowForWidget( const QWidget * widget )
{
QWindow * window = widget->windowHandle();
if( window )
return window;
const QWidget * nativeParent = widget->nativeParentWidget();
if( nativeParent )
return nativeParent->windowHandle();
return nullptr;
}
HWND getHWNDForWidget( const QWidget * widget )
{
QWindow * window = ::windowForWidget( widget );
if( window && window->handle() )
{
QPlatformNativeInterface * iface = QGuiApplication::platformNativeInterface();
return static_cast<HWND>(iface->nativeResourceForWindow( QByteArrayLiteral( "handle" ), window ));
}
return nullptr;
}