Qt 5.0提供了一个新的QWindow
类。虽然关于这个类的文档非常全面,但我没有看到QWindow
与QWidget
类的确切区别,以及在哪些情况下您更喜欢前者。两者都提供了一种在屏幕上可视化各种事物的方便方式,都可以使用QPainter
进行绘图,并且都有一种与OpenGL交互的方式。
在API的描述中,它说:
应用程序通常会使用QWidget或QQuickView作为其UI,而不是直接使用QWindow。
因此,这对窗户来说似乎不是一个优势。此外,它指出:
Windows可能会占用大量内存。通常的测量方法是宽度乘以高度乘以颜色深度。窗口还可能包括多个缓冲区,以支持双重和三重缓冲,以及深度和模具缓冲区。
这似乎不赞成使用QWindow
。那么在什么情况下你会使用它呢?
QWindow
已在Qt 5.0中引入,原因是gui/widgets分离。QWidget
现在生活在自己的图书馆(QtWidgets
)中;有必要为非基于窗口小部件的应用程序提供"顶层窗口"的抽象,因此创建了QWindow
,并存在于QtGui
中。
有一整类非基于小部件的应用程序:所有这些都使用QtQuick2。它们根本不使用QtWidget库,事实上,在使用它们时,您总是以某种方式明确地使用QWindows(QQuickView
继承自QWindow
)。
即使在使用小部件时,Qt内核也会为您创建顶级QWindows,这也会使此类QWindows对象的属性和标志与相应的顶级QWidget保持同步。通过这种方式,您可以像往常一样处理小部件,而完全不了解QWindow。现有的应用程序将继续按预期运行,等等。
到目前为止,我明确使用QWindow
的唯一原因是针对一个非常特定的用例:绘制纯OpenGL内容。这很容易实现(通过在窗口上设置OpenGL曲面类型),并避免了引入额外的依赖项(QtWidgets、QtOpenGL等,它们在库大小方面有成本)它允许在大约10行代码中创建OpenGL绘图表面,这些代码将在Linux、Windows、Mac、QNX、"嵌入式Linux"以及很可能的Android和iOS上工作从这个角度来看,它是SDL的完美替代品。:)