Подтвердить что ты не робот

В чем разница между QWindow и QWidget

Qt 5.0 предоставляет новый класс QWindow. Хотя документация по этому классу довольно полная, я не понимаю, как именно QWindow отличается от класса QWidget, и в каких случаях вы предпочтете первое. Оба обеспечивают удобный способ визуализации на экране всех видов вещей, оба могут использовать QPainter для рисования, и оба имеют способ взаимодействия с OpenGL.

В описании API говорится, что:

Приложение обычно использует QWidget или QQuickView для своего пользовательского интерфейса, а не напрямую QWindow.

Таким образом, это не является преимуществом для окна. Более того, в нем говорится:

Windows может потенциально использовать много памяти. Обычное измерение - ширина раз высота разность цветов. Окно может также включать несколько буферов для поддержки двойной и тройной буферизации, а также буферов глубины и трафарета.

Это не похоже на использование QWindow. Итак, в каких случаях вы могли бы использовать его?

4b9b3361

Ответ 1

QWindow был введен в Qt 5.0 из-за разделения gui/widgets. QWidget теперь живет в своей собственной библиотеке (QtWidgets); необходимо было предоставить абстракцию "верхнего окна" для приложений, не связанных с виджетами, и, таким образом, QWindow был создан - и живет в QtGui.

Существует целый класс приложений, не связанных с виджетами: все, кто использует QtQuick2. Они вообще не используют библиотеку QtWidget, и, по сути, при их использовании вы всегда как-то используете QWindows явно (QQuickView наследует от QWindow).

Даже при использовании виджетов QWindows верхнего уровня создается для вас ядром Qt, который также сохраняет свойства и флаги таких объектов QWindow в синхронизации с соответствующими QWidgets верхнего уровня. Таким образом, вы можете просто иметь дело с виджетами, которые вы всегда делали, не зная о QWindow. Существующие приложения будут продолжать работать, как ожидалось, и т.д. И т.д.

Единственная причина, по которой я использовал QWindow явно, - это очень конкретный прецедент: , чтобы нарисовать чистый контент OpenGL. Этого очень легко достичь (установив тип поверхности OpenGL в окне) и избегайте использования дополнительных зависимостей (QtWidgets, QtOpenGL и т.д., Которые имеют стоимость с точки зрения размера библиотеки); позволяет создать поверхность рисования OpenGL в виде 10 строк кода, которые будут работать на Linux, Windows, Mac, QNX, "встроенной Linux" и, скорее всего, на Android и iOS. С этой точки зрения он выступает в качестве идеальной замены SDL.:)