Qt BUG 与解决方案合集(持续更新)

  • Qt Creator 的开启和关闭等操作变得异常缓慢,查看任务管理器发现其在卡住时执行大量 I/O 读写,且存在巨量分页错误。

    对于该问题,我们可以删除 QtCreator.ini 文件中异常的内容。(直接删除将导致项目历史记录和快捷键等配置信息丢失)

    详情参见 我是标同学 的文章。

  • 在 Qt Creator 11.0.2 中,QML 仿真层会警告使用的一些附加插件不兼容。这可能是因为 QML 仿真层查找插件文件的路径不正确,没有正确找到对应版本的 Qt 插件库;或者 QML 仿真层是基于其它版本 Qt 构建的,其不兼容。

  • 截止 Qt5.15.2,当 win10 系统设置区域格式为 '香港' 或 '澳门' 时,QDateTime.toString("yyyy-MM-dd HH:mm:ss") 将返回乱码。

    该问题无法通过重启程序和系统来解决,只能换用其它方式来输出格式化时间,如:

    auto secs = QDateTime::currentSecsSinceEpoch();
    qDebug() << "secs:" << secs;
    
    QDateTime t = QDateTime::fromTime_t(secs);		 // , Qt::UTC
    qDebug() << t.toString("yyyy-MM-dd HH:mm:ss");   // 输出乱码
    t = QDateTime::fromSecsSinceEpoch(secs);		 // , Qt::UTC
    qDebug() << t.toString("yyyy-MM-dd HH:mm:ss");   // 输出乱码
    
    QLocale loc(QLocale::Chinese, QLocale::HongKong);
    qDebug() << loc.toString(QDateTime::currentDateTime(), "yyyy-MM-dd HH:mm:ss");   // 正常
    
    // 或
        t = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC);
        QDate d = t.date();
        QTime tm = t.time();
        QString sTime = QString("%1-%2-%3 %4:%5:%6")
            .arg(d.year(), 4, 10, QChar( '0'))
            .arg(d.month(), 2, 10, QChar( 'O'))
            .arg(d.day(), 2, 10, QChar( '0'))
            .arg(tm.hour(), 2, 10, QChar( '0'))
            .arg(tm.minute(), 2, 10, QChar( 'O'))
            .arg(tm.second(), 2, 10, QChar( '0'));
    

    参见 QTBUG-74668

  • Qt 5.15.2 的 QSvgRenderer 对百分比数值的支持似乎不太好,对于如下 svg 图片:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 117 117" >
    	<rect width="100%" height="100%" fill="#FFFFFF"/>
    </svg>
    

    Qt 将 rect 的大小解释为 100x100 而不是 117x117,这会导致显示黑边框。为此,我们不得不放弃百分比数值的用法。

  • QWidget::underMouse 在一些场景下会返回预期外的结果,如:鼠标下的组件自动隐藏/显示/移动时,underMouse 返回的结果并不会随之更新。

    当前可行的替代方案是:

    QPoint cursorPos = QCursor::pos();
    return m_pTitleWidget->rect().contains(m_pTitleWidget->mapFromGlobal(cursorPos));
    
  • Qt 5.15.3 之前的版本下多线程访问 QDateTime::toString 或 fromString 时 (访问 qcalendar),在 Debug 模式下会出现 byId[size_t(id)] == nullptr 错误,这是因为多线程同时创建了预期为单例的 QCalendarBackend 对象。

    对于该问题,我们可以通过创建 QCalendar 来初始化一个默认类型的 QCalendarBackend 单例对象来解决 (如果需要其它类型则需要指定相应类型)。

    参见: https://forum.qt.io/topic/120355/qdatetime-asserthttps://codereview.qt-project.org/c/qt/qtbase/+/309673

  • 使用 MSVC++ 编译器时,可以通过指定如下参数来在 release 模式下生成 pdb 文件:

    # 生成 PDB 文件 #
    QMAKE_LFLAGS += /DEBUG
    
  • Qt 在绘制滑块时并不将区域限制在 progressBar 的圆角矩形区域中, 这会导致滑块到达边界时圆角失效:

    QProgressBar* progressBar = new QProgressBar();
    		progressBar->setFixedSize(340, 6);
    		progressBar->setFixedHeight(6);
    		progressBar->setMaximum(0);
    		progressBar->setStyleSheet(
    			"QProgressBar { border-radius: 3px; background: #4378FF; }"
    			"QProgressBar::chunk {"
    			"background: qlineargradient(x1 : 0, y1 : 0, x2 : 1, y2 : 0, stop : 0 rgba(0, 0, 0, 0), stop : 0.5 #00d1ff, stop:1 rgba(0, 0, 0, 0)); "
    			// HACK: 
    			// Qt 在绘制滑块时并不将区域限制在 progressBar 的圆角矩形区域中, 这会导致滑块到达边界时圆角失效.
    			// 因此, 我们选择收缩滑块高度以减轻圆角失效.
    			"border-radius: 2px;"
    			"border: 1px solid rgba(0,0,0,0);"  
    			"}"
    		);
    
  • QTextDocument.addResource 不支持 windows 目录路径,如:D:\\image.png
    其表现的结果为:name 为【windows 目录路径】的 QTextImageFormat 不会在 QTextDocument.addResource 之后更新。

  • 使用 QSettings 访问注册表时必须向其构造函数传入最终要访问的注册表路径,且 format 必须为 QSettings::NativeFormat。
    其无法跨路径读取属性,甚至子级路径都不行
    例:

    QSettings settings("HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command", QSettings::NativeFormat);
    qDebug() << settings.value("Default").toString();
    
  • msvc-version.conf loaded but QMAKE_MSC_VER isn't set 错误: 如果是在切换编译器时出现该错误,那么可以通过删除构建目录下的 .qmake.stash 文件或新建 pro.user 来解决。

  • 为 QLabel 设置 wordWarp 属性可能导致自适应布局出现问题。

  • 有时在 pro 或 pri 文件中添加中文注释后会出现中文乱码。

    可以通过在注释的末尾也加上 # 符号来解决。详情参见:http://www.qtcn.org/bbs/simple/?t45478.html

posted @ 2025-12-18 22:19  邓加领  阅读(2)  评论(0)    收藏  举报