2015-05-11 8 views
6

W mojej aplikacji Qt 5.3, chcę zintegrować GUI z procesu dziecka w moim głównym oknem procesu:błędy rysowania i krach z QWidget :: createWindowContainer

  1. Proces dziecko tworzy najwyższego poziomu QWidget .
  2. Proces potomny komunikuje widget WId z powrotem z QWidget::winId() do rodzica (przy użyciu IPC).
  3. Jednostka nadrzędna używa QWindow::fromWinId() i QWidget::createWindowContainer() do utworzenia QWidget wyświetlającej GUI procesu potomnego. Ten widget jest osadzony w innym układzie widżetu.

Uwagi:

  1. GUI dziecko jest wyświetlane ale nie wyświetlane poprawnie: istnieją białe granice, które nie uzyskać zaktualizowane poprawnie podczas ponownego zaklejania rodzica.
  2. Jeśli rozmiar okna nadrzędnego jest zbyt mały, proces potomny ulega awarii z powodu naruszenia dostępu do pamięci w kodzie Qt.
  3. Jeśli nie określam elementu nadrzędnego z QWidget::createWindowContainer(), aby zamiast niego używać osobnego okna najwyższego poziomu, element potomny jest osadzony poprawnie.
  4. Po tym, jak dziecko otworzy modalne okno dialogowe, takie jak QMessageBox, problem rozwiązuje się, a element potomny jest poprawnie osadzony po następnej zmianie rozmiaru elementu nadrzędnego.

Szczególnie ostatni punkt mnie zastanawia. Próbowałem sprawdzić, czy zmiana QMessageBox zmienia niektóre flagi w widgecie podrzędnym i czy mogę zasymulować te zmiany ręcznie, aby obejść problem, bez powodzenia.

Czy ktoś ma pomysł, co się tutaj dzieje? Co może zrobić modalne okno dialogowe z widgetem, który rozwiązuje problem?

Odpowiedz

3

Po pierwsze - dziękuję za to pytanie. Przed tym czasem nie wiem o tej funkcji w Qt. Spędzam trochę czasu, aby zaimplementować Twoje rozwiązanie i mieć ten sam problem: białą ramkę.

Po kilku testach staram się robić okna reparenting w locie i zamiast białych granic nie było rodzimych granice systemowe:

native borders after reparenting

Wygląda na to, kiedy rozmowa QWidget::createWindowContainer Qt dostać rozmiaru całego okna, wyświetlanie QWidget (o mniejszym rozmiarze niż całe okno) i wypełnij tło kolorem białym.

Znalazłem rozwiązanie dla tego problemu: ustaw Qt::FramelessWindowHint flagę okna widgetu potomnego, zanim zadzwonisz pod numer createWindowContainer w oknie nadrzędnym.

this->setWindowFlags(Qt::FramelessWindowHint); 

Nie mogłem odtworzyć problemu z awarią po zmianie rozmiaru. Dodaję widżet podrzędny do układu i działa dobrze.

Możesz obejrzeć mój example source at Git Hub.

Jeśli to nie rozwiąże problemu z awarią, proszę podać źródło tego problemu.

UWAGA: w przykładzie na GitHub uruchomię projekt potomny, odczytam plik winId z wyjścia debugowania, zmodyfikuję źródło nadrzędne i uruchomię projekt nadrzędny.

+0

Dziękuję za odpowiedź! Ponieważ nie jestem w biurze w tej chwili, spróbuję twojej porady i udzielę informacji zwrotnej w poniedziałek CET. Jestem bardzo podekscytowany, aby sprawdzić, czy Twoje proste rozwiązanie działa! –

+0

Yay, 'FramelessWindowHint' naprawia renderowanie ramek * i * awarię! Cieszę się, że istnieje takie proste rozwiązanie/obejście. Dziękuję, zasłużyłeś na nagrodę! :) –