Seite 1 von 1

QTWidget in MFC CMDIChildWnd Problem

Verfasst: 7. Dezember 2007 10:31
von Ulli
Hallo zusammen,

ich habe folgendes Problem:

Ich habe eine Anwendung, die komplett mif der MFC erstellt wurde und auf dem MDI Konzept beruht.
Meine Aufgabe ist es nun, ein QTWidget zu programmieren, dass sich am Rand eines MDI Fensters befindet. Dieses QT Widget soll quasi als erweiterte Toolbar fungieren.
Dazu habe ich eine von QWidget abgeleitete Klasse erstellt, die als Parent das MDI Fenster über die Brücke QWinWidget erhält.
Die neue Klasse heisst: QDatChildMenuBar.
Eine leere Toolbar (m_pRightToolbar) von MFC dient hier als Platzhalter, worüber sich mein QWidget legen soll.

Code: Alles auswählen

QWinWidget *wRight = new QWinWidget(this->GetSafeHwnd());
wRight->showCentered();

m_pQMenuBarRight = new QDatChildMenuBar(wRight);
m_pRightToolbar->GetWindowRect(&r);  // Dimension des Platzhalters holen
m_pQMenuBarRight->OnParentRepaint(r.left, r.top, r.Width(), r.Height()); // Passt die eigene Größe an die Größe des Platzhalters an
m_pQMenuBarRight->CreateVerticalBar();  // Erzeugt die internen Child-Widgets in einem QVBoxLayout
m_pQMenuBarRight->show();
Ansatz 1

Das klappt auch ganz gut, nur wird das Widget nicht angezeigt wenn ich im Konstruktor keine WindowFlags übergeben, also so:

Code: Alles auswählen

QDatChildMenuBar::QDatChildMenuBar(QWidget * parent) : QWidget(parent)
Die Klasse wird definitv angelegt und ich kann auch über das parent zurück auf meine MDI Klasse zugreifen, aber sie wird nicht angezeigt.
Bild
In den freien Bereichen unten und rechts im Fenster sollte sich mein QT Widget hinpflanzen.


Ansatz 2


Nun kann man im Konstruktor weitere WindowFlags übergeben, danach wird mein Widget gezeichnet. Aber es entsteht ein neues Problem:

Code: Alles auswählen

QDatChildMenuBar::QDatChildMenuBar(QWidget * parent) : QWidget(parent, Qt::Window|Qt::FramelessWindowHint)
Die Verwendung von Qt::Window erzeugt offenbar ein QDialog-ähnliches Widget, das leider die Eigenschaft hat, IMMER über den MDI Fenstern zu liegen.
Bild



Beide Ansätze führen bisher nicht zum Ziel, denn einmal wird mein Widget gar nicht gezeichnet, und beim anderen mal liegt es immer im Vorderund. Kann mir jemand von euch dabei helfen?

Gruß,
Ulli.

Verfasst: 7. Dezember 2007 11:51
von Christian81
Läuft auch deine Qt Eventloop?

Verfasst: 7. Dezember 2007 12:03
von Ulli
Also im Ansatz 1 kommen keine PaintEvent Nachrichten in meinem Widget an, im Ansatz 2 schon.
Allerdings ist Ansatz 2 nicht brauchbar.

Verfasst: 7. Dezember 2007 12:06
von Christian81
Und was hat das mit meiner Frage zu tun?
QtWidgets funktionieren nur wenn es auch eine QApplication inklusive Eventloop gibt. Das ist bei Dir wohl nicht der Fall. Von Trolltech gibt es (imho) eine kommerzielle Lösung um Qt und MFC zusammen zu benutzen.

Verfasst: 7. Dezember 2007 12:22
von Ulli
Nun, diese kommerzielle Lösung ist das QtMfcMigration Framework und das habe ich im Einsatz.

In meiner DllMain wird auch ganz nach Anleitung ein QApplication Objekt angelegt mit:

Code: Alles auswählen

QMfcApp::pluginInstance(hInstance);
Demnach läuft meine Qt Eventloop. Wenn ich mein Widget als Dialog anlege (Ansatz2) kann ich auch das volle Signal/Slot Prinzip nutzen, nur im Ansatz 1 nicht. Denn da wird mein Widget gar nicht erst gezeichnet, aber es existiert und ich kann auch einzelne Methoden, sowie Slots, die ihrereseits an andere Slots gebunden sind aufrufen.

Verfasst: 7. Dezember 2007 12:49
von Christian81
Ok - ich denke nicht dass Du hier Hilfe bekommen kannst. Erstens ist es kommerziell und zweitens sehr selten benutzt. Wohl mal eher bei trolltech direkt nachfragen.