Qt for Windows - 具体问题

此页面包含的信息有关 Qt for Windows .

安装位置

把 Qt 安装到带空格的目录下,例如 C:\Program Files ,可能导致 qmake 出现问题。

把 Qt 安装到不带空格的子目录下,能避免此问题。

最大路径长度

The Win32 API that both Qt and compiler tools use has a built-in maximum file path length of 260 characters ( MAX_PATH ). This can hit you in various forms if either your absolute or relative directory structures are too verbose. It is therefore recommended to keep the file system paths within limits, and put build directories nearby the source directories.

Visual Studio

若使用修改 Structure 和 Union 成员对齐的特殊标志时遇到奇怪问题 (譬如 /Zp2 ) 那么就需要采用为应用程序设置的标志重新编译 Qt。

基于 OpenGL 的窗口全屏

当窗口使用基于 OpenGL 的表面并以全屏方式出现时,属于应用程序的其它顶层窗口可能发生问题。由于 Windows DWM (桌面窗口管理器) 的局限性,基于 OpenGL 的窗口合成未被正确处理,当进入全屏模式时。因此,其它顶层窗口不会被放置在全屏窗口的顶部,当它们变得可见时。例如,菜单可能未正确出现,或对话框无法展示。

窗口可以明确使用基于 OpenGL 的表面,当 setSurfaceType () is called, or when something that requires OpenGL is used inside the window, causing the whole window to be OpenGL based. For example, QOpenGLWidget or QQuickWidget 可以触发这。不管怎样,若表面包含在 QWindow 其托管采用 createWindowContainer (), or the obsoleted QGLWidget is used and it does cover the entire full screen window, then this problem does not occur.

To solve this problem, native APIs can be used to enable the WS_BORDER attribute when showing in full screen mode. This can be utilized as follows:

bool Widget::event(QEvent *e) {
#if defined(Q_OS_WIN)
    if (e->type() == QEvent::WinIdChange) {
        if (windowHandle()) {
            HWND handle = reinterpret_cast<HWND>(windowHandle()->winId());
            SetWindowLongPtr(handle, GWL_STYLE, GetWindowLongPtr(handle, GWL_STYLE) | WS_BORDER);
        }
    }
#endif
    return QWidget::event(e);
}
					

这将给予全屏窗口 1 像素边框,从而使其它顶层窗口能够出现在顶部。