2009-09-26 6 views
0

J'utilise la solution QtWinMigrate pour afficher les boîtes de dialogue de mes DLL de plug-in chargées dans une application Mfc tierce. Le problème est le suivant:Réduction de l'application Mfc avec la boîte de dialogue ouverte Qt

Lorsque je réduis la fenêtre principale de mon application Mfc et que je la restaure à nouveau, toutes mes boîtes de dialogue ouvertes Qt sont perdues. J'ai découvert que mes boîtes de dialogue Qt sont détruites et que les destructeurs sont appelés.

J'ai fait quelques débogage et a découvert ce qui suit:

Quand je ferme ma fenêtre principale Mfc ma boîte de dialogue Qt obtient WM_SHOWWINDOW message avec SW_PARENTCLOSING wparam Parametar. Ensuite QtWndProc est appelée, qui, pour les questions de cas SW_PARENTCLOSING envoie QHideEvent:

dans QtWndProc() dans la ligne de fichier qapplication_win.cpp 2160

case WM_SHOWWINDOW : 

if(lparam==SW_PARENTCLOSING) { 
    QHideEvent e; 
    qt_sendSpontaneousEvent(widget,e); 
    widget->hideChildren(true); //////////////////// 

et eventFilter de QWinWidget envoie DefferedDelete qui supprime mon dialogue:

dans QWinWidget.cpp en ligne 280

QWinWidget::eventFilter(OObject* o, QEvent* e){ 

    case QEvent::Hide: 

    if(w->testAtrribute(Qt::WA_DeleteOnClose) 

    deleteLater(); 

}

Quelqu'un peut-il m'expliquer ce comportement? Cela me semble bug.

Merci

+0

J'essaie d'utiliser QtWinMigrate avec une DLL plugin aussi. Bien que je puisse obtenir une fenêtre Qt pour apparaître, la fenêtre ne répond pas du tout comme si elle n'obtenait aucun événement (alors que l'application MFC reste réactive). Avez-vous déjà rencontré cela ou avez-vous une idée sur la façon de le résoudre? – User

+0

Je montre seulement des fenêtres de QDialog de ma DLL de plugin. Je ne suis pas sûr si vous pouvez montrer QMainWindow. Cependant, vérifiez si vous avez configuré le crochet de message de manière appropriée. Définissez le point d'arrêt dans QtFilterProc dans qmfcapp.cpp et vérifiez s'il est touché. Cette fonction envoie les messages Windows à Qt pour traitement. – user152508

+0

Lors de la création de la boîte de dialogue qt, définissez également sa fenêtre parente comme fenêtre principale de l'application MFC hôte. – user152508

Répondre

Questions connexes