Qt GUI 的变化

Qt 6 是努力使框架更高效,且更易于使用的结果。

为兼容每个发行的所有公共 API,我们试着维护二进制和源代码。但是,为使 Qt 成为更优框架,一些改变是不可避免的。

In this topic we summarize those changes in Qt GUI, and provide guidance to handle them.

内核类

The QBitmap class

Implicit construction of a QBitmap QPixmap is no longer supported. The constructor and assignment operator have been made explicit and marked as deprecated. Use the new static factory function fromPixmap 代替。

The QCursor class

Implicit construction of a QCursor QPixmap is no longer supported, the constructor has been made explicit.

The QKeyCombination class

QKeyCombination is a new class for storing a combination of a key with an optional modifier. It should be used as a replacement for combining values from the Qt::Key enum with a modifier in a type-safe way.

We recommend migrating code that currently uses operator+() to combine a key and modifiers, as future C++ standards are likely to declare arithmetic operations between unrelated enumeration types as illegal. Use operator|(), and change APIs that expect an int to expect a QKeyCombination 代替。

Existing APIs that expect an int for a key combination can be called using QKeyCombination::toCombined ().

Text classes

The QFontDatabase class

The QFontDatabase class has now only static member functions. The constructor has been deprecated. Instead of e.g.

const QStringList fontFamilies = QFontDatabase().families();
					

使用

const QStringList fontFamilies = QFontDatabase::families();
					

The QFont class

The numerical values of the QFont::Weight enumerator have been changed to be in line with OpenType weight values. QFont::setWeight () expects an enum value instead of an int , and code that calls the setter with an integer will fail to compile. To continue to use old integer values, use QFont::setLegacyWeight().

Painting classes

See the porting guide for Qt Print Support for information about QPagedPaintDevice and other printing related classes.

Utility classes

QIntValidator and QDoubleValidator

The setRange () method is no longer marked as virtual.

OpenGL classes

With the introduction of Qt RHI as the rendering foundation in Qt, most classes prefixed by QOpenGL have been moved into the Qt OpenGL 模块。

More details can be found in the Qt OpenGL porting guide .

One notable exception is the class QOpenGLContext , which still resides in Qt GUI.

In addition, the class QOpenGLWidget has been moved to a new module, named Qt OpenGL Widgets.

The QOpenGLContext class

The QOpenGLContext::versionFunctions() function is replaced by QOpenGLVersionFunctionsFactory::get (). QOpenGLVersionFunctionsFactory is a public class now, part of the Qt OpenGL 模块。

ANGLE

On Windows, ANGLE, a third-party OpenGL ES to Direct 3D translator, is no longer included in Qt. This means Qt::AA_UseOpenGLES and the environment variable QT_OPENGL=angle no longer have any effect. In dynamic OpenGL builds there is no automatic fallback to ANGLE in case OpenGL proper fails to initialize. For QWindow or QWidget based applications using OpenGL directly, for example via QOpenGLWidget , this means that OpenGL proper is the only option at run time. However, the alternative of using a pure software OpenGL implementation, such as Mesa llvmpipe that is shipped with the pre-built Qt packages, is still available. For Qt Quick and Qt Quick 3D applications, Qt 6 introduces support for Direct 3D 11, Vulkan, and Metal, in addition to OpenGL. On Windows the default choice is Direct 3D, therefore the removal of ANGLE is alleviated by having support for graphics APIs other than OpenGL as well.

Native clipboard integration

Qt 5 provided interfaces for integrating platform specific or custom clipboard formats into Qt through QMacPasteboardMime in QtMacExtras ,和 QWindowsMime from the Windows QPA API. Since Qt 6.6, the equivalent functionality is provided by the classes QUtiMimeConverter for macOS, and the QWindowsMimeConverter for Windows.

Porting from QWindowsMime to QWindowsMimeConverter requires practically no changes, as the virtual interface is identical. However, in Qt 6 it is no longer needed to register a QWindowsMimeConverter implementation; instantiating the type implicitly registers the converter.

Porting a QMacPasteboardMime to QUtiMimeConverter requires renaming some of the virtual functions. Note that the QMacPasteboardMime API used the outdated term flavor for the native clipboard format on macOS, whereas the platform now uses Uniform Type Identifiers , i.e. UTI s, which Qt has adapted for function and parameter names.

The mimeFor and flavorFor functions are replaced by the mimeForUti and utiForMime implementations, respectively. Those should return the name of the mime type or UTI that the converter can convert the input format to, so a port usually just involves renaming existing overrides. The convertToMime , convertFromMime ,和 count 函数在 QUtiMimeConverter are identical to their QMacPasteboardMime versions.

The canConvert , converterName functions are no longer needed, they are implied by implementation of the above functions, so overrides of those functions can be removed.

As with the the QWindowsMimeConverter , registration is done by instantiating the type.