2015-05-11 5 views
6

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

  1. Das Kind Prozess erstellt eine Top-Level-QWidget .
  2. Der untergeordnete Prozess kommuniziert die WId des Widgets als zurückgegeben von QWidget::winId() an den übergeordneten (mit IPC).
  3. Das übergeordnete Element verwendet QWindow::fromWinId() und QWidget::createWindowContainer(), um ein QWidget zu erstellen, das die GUI des untergeordneten Prozesses anzeigt. Dieses Widget ist in das Layout eines anderen Widgets eingebettet.

Beobachtungen:

  1. 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.
  2. Wenn die Größe des übergeordneten Fensters zu klein ist, stürzt der untergeordnete Prozess aufgrund einer Speicherzugriffsverletzung in Qt-Code ab.
  3. 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.
  4. 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?

Antwort

3

Zunächst einmal - vielen Dank für diese Frage. Vor dieser Zeit weiß ich nichts über diese Funktion in Qt. Ich verbringe etwas Zeit, um Ihre Lösung zu implementieren und habe das gleiche Problem: weiße Grenze.

Nach einem paar Tests versuche ich Fenster Neuzuordnung on the fly zu tun und stattdessen weißen Ränder gibt es native OS Grenzen:

native borders after reparenting

Es sieht aus wie wenn ein Anruf QWidget::createWindowContainer Qt Größe des gesamten Fensters erhält, Anzeige QWidget (mit kleinerer Größe als das gesamte Fenster) und füllen Sie den Hintergrund mit weißer Farbe.

Ich habe eine Lösung für dieses Problem gefunden: Set Qt::FramelessWindowHint Fenster Flag für Kind-Widget, bevor Sie createWindowContainer im übergeordneten Fenster aufrufen.

this->setWindowFlags(Qt::FramelessWindowHint); 

Ich konnte das Problem mit einem Absturz nach der Größenanpassung nicht reproduzieren. Ich füge Kind Widget zum Layout hinzu und es funktioniert gut.

Sie können meine example source at Git Hub betrachten.

Wenn es Ihr Problem mit Absturz nicht löst, stellen Sie bitte eine Quelle für dieses Problem zur Verfügung.

HINWEIS: Im Beispiel auf GitHub ich Kindprojekt ausführen, WinId aus Debug-Ausgabe lesen, Eltern-Quelle ändern und dann übergeordnete Projekt ausführen.

+0

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! –

+0

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! :) –