In meiner Qt 5.3 Anwendung, möchte ich die GUI von einem untergeordneten Prozess in mein Haupt-Prozess Fenster integrieren:Zeichnung Fehler und Absturz mit QWidget :: createWindowContainer
- Das Kind Prozess erstellt eine Top-Level-
QWidget
. - Der untergeordnete Prozess kommuniziert die
WId
des Widgets als zurückgegeben vonQWidget::winId()
an den übergeordneten (mit IPC). - Das übergeordnete Element verwendet
QWindow::fromWinId()
undQWidget::createWindowContainer()
, um einQWidget
zu erstellen, das die GUI des untergeordneten Prozesses anzeigt. Dieses Widget ist in das Layout eines anderen Widgets eingebettet.
Beobachtungen:
- Das Kind GUI angezeigt wird, aber nicht korrekt wiedergegeben: Es weißen Ränder sind, die ordnungsgemäß erhalten nicht aktualisiert, wenn die Eltern wieder Sizing.
- Wenn die Größe des übergeordneten Fensters zu klein ist, stürzt der untergeordnete Prozess aufgrund einer Speicherzugriffsverletzung in Qt-Code ab.
- Wenn ich kein übergeordnetes Element mit
QWidget::createWindowContainer()
angeben, um stattdessen ein separates Fenster der obersten Ebene zu verwenden, wird das untergeordnete Element problemlos eingebettet. - Nachdem das Kind einen modalen Dialog wie
QMessageBox
geöffnet hat, behebt das Problem sich selbst, und das Kind wird nach der nächsten Größenänderung des übergeordneten Elements korrekt eingebettet.
Besonders der letzte Punkt verwirrt mich. Ich habe versucht, herauszufinden, ob das Ausführen der QMessageBox
einige Flags auf dem untergeordneten Widget ändert und wenn ich diese Änderungen manuell simulieren kann, um das Problem ohne Glück zu umgehen.
Hat jemand eine Idee, was hier passiert? Was könnte der modale Dialog möglicherweise mit dem Widget tun, das das Problem behebt?
Vielen Dank für Ihre Antwort! Da ich momentan nicht im Büro bin, werde ich versuchen, Ihren Rat zu geben und am Montag CET Feedback zu geben. Ich bin ziemlich gespannt, ob Ihre einfache Lösung funktioniert! –
Yay, der 'FramelessWindowHint' behebt sowohl das Rand-Rendering * als auch * den Absturz! Ich bin froh, dass es so eine einfache Lösung/Workaround gibt. Danke, du hast das Kopfgeld verdient! :) –