2015-05-11 3 views
6

В моем Qt 5.3 приложения, я хочу, чтобы интегрировать GUI из дочернего процесса в моем главное окно процесса:ошибка рисования и авария с QWidget :: createWindowContainer

  1. дочерний процесс создает верхний уровень QWidget ,
  2. Детский процесс связывает виджет WId как возвращаемый с QWidget::winId() родительскому объекту (с использованием IPC).
  3. Родитель использует QWindow::fromWinId() и QWidget::createWindowContainer() для создания QWidget отображения графического интерфейса дочернего процесса. Этот виджет встроен в макет другого виджета.

Наблюдение: отображается

  1. ГИП ребенок, но не отображается правильно: есть белые границы, которые не обновляются должным образом при повторной калибровке родителя.
  2. Если размер родительского окна слишком мал, дочерний процесс выходит из строя из-за нарушения доступа к памяти в коде Qt.
  3. Если я не укажу родителя с QWidget::createWindowContainer(), чтобы вместо этого использовать отдельное окно верхнего уровня, он встроен просто отлично.
  4. После того, как ребенок открывает модальное диалоговое окно, такое как QMessageBox, проблема исправляет себя, и ребенок встроен правильно после следующего изменения размера родителя.

Особенно, что касается вопросов, связанных с последней точкой. Я попытался выяснить, запускает ли QMessageBox некоторые флаги дочернего виджета, и если я смогу имитировать эти изменения вручную, чтобы обойти проблему без везения.

Есть ли у кого-нибудь идеи, что здесь происходит? Что может сделать модальный диалог с виджетами, которые устраняют проблему?

ответ

3

Прежде всего, спасибо за этот вопрос. До этого времени я не знаю об этой функции в Qt. Я потрачу некоторое время на то, чтобы реализовать ваше решение и иметь ту же проблему: белая рамка.

После нескольких тестов я пытаюсь сделать окно reparenting на лету и вместо белых границ там был родной границы OS:

native borders after reparenting

Похоже, когда вызов QWidget::createWindowContainer Qt получить размер всего окна, дисплей QWidget (с меньшим размером, чем все окно) и заполнить фон белым цветом.

Я нашел решение этой проблемы: установите флаг Qt::FramelessWindowHint для дочернего виджета, прежде чем вы вызываете createWindowContainer в родительском окне.

this->setWindowFlags(Qt::FramelessWindowHint); 

Я не смог воспроизвести проблему сбой после изменения размера. Я добавляю дочерний виджет в макет, и он отлично работает.

Вы можете посмотреть мои example source at Git Hub.

Если это не поможет решить вашу проблему с аварийной ситуацией, пожалуйста, укажите источник этой проблемы.

ПРИМЕЧАНИЕ: в примере на GitHub я запускаю дочерний проект, читаю winId из вывода отладки, изменяю родительский источник и запускаю родительский проект.

+0

Спасибо за ваш ответ! Поскольку я не нахожусь в офисе, я попробую ваш совет и даю отзывы в понедельник CET. Я очень рад видеть, работает ли ваше простое решение! –

+0

Yay, «FramelessWindowHint» исправляет как рендеринг границ, так и * сбой! Я рад, что существует такое простое решение/обходное решение. Спасибо, ты заработал щедрость! :) –

Смежные вопросы