本页内容

Windows 版 Qt - 具体问题

本页面包含有关Windows 版 Qt 的信息。

安装位置

如果将 Qt 安装到包含空格的目录中(例如C:\Program Files),可能会导致 qmake 出现问题。

请将 Qt 安装到不包含空格的子目录中,以避免此问题。

最大路径长度

Qt 和编译器工具共同使用的 Win32 API 内置的最大文件路径长度为 260 个字符(MAX_PATH )。如果您的绝对或相对目录结构过于冗长,可能会以各种形式对您造成影响。 因此,建议将文件系统路径控制在限制范围内,并将构建目录放在源代码目录附近。

Visual Studio

如果您在使用修改结构体和联合体成员对齐方式的特殊标志(例如/Zp2 )时遇到奇怪的问题,则需要使用为应用程序设置的标志重新编译 Qt。

基于 OpenGL 的全屏窗口

当一个窗口使用基于 OpenGL 的表面并以全屏模式显示时,应用程序中的其他顶级窗口可能会出现问题。由于 Windows DWM 的限制,基于 OpenGL 的窗口进入全屏模式时,合成处理无法正确进行。 因此,当其他顶级窗口被显示出来时,它们不会被放置在全屏窗口之上。例如,菜单可能无法正确显示,或者对话框无法出现。

窗口可以通过显式调用 `setSurfaceType()` 来使用基于 OpenGL 的绘制表面,或者当窗口内部使用了需要 OpenGL 的内容时,会导致整个窗口基于 OpenGL。 例如,QOpenGLWidget 或QQuickWidget 都会触发这种情况。但是,如果该渲染面包含在通过createWindowContainer()托管的QWindow 中,或者使用了已弃用的QGLWidget且其确实覆盖了整个全屏窗口,则不会出现此问题。

要解决此问题,可以在全屏模式下显示时,使用原生 API 启用WS_BORDER 属性。具体实现如下:

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 像素的边框,从而允许其他顶级窗口显示在顶层。

OLE 初始化

Qt 在 Windows 上使用OLE来支持拖拽或剪贴板访问等功能。要使用 OLE,Qt 必须调用OleInitialize。这将把线程的并发模型设置为COINIT_APARTMENTTHREADED 。

在 UI 线程上调用 `CoInitializeEx ` 或 `winrt::init_apartment ` 并指定单线程公寓以外的并发模型(分别是 `COINIT_APARTMENTTHREADED ` 或 `winrt::apartment_type::single_threaded`),可能会导致错误或应用程序挂起。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.