《QDebug 2023年1月》

一、Qt Widgets 问题交流

二、Qt Quick 问题交流

三、其他

1.QScreen::grabWindow 截屏

如果没有指定范围,默认是截取对应屏幕的区域

//QScreen文档https://doc.qt.io/qt-5.15/qscreen.html
QScreen *screen = QGuiApplication::primaryScreen();
if (!screen) return;
QRect area = screen->virtualGeometry();
QString filename = "Screenshot ";
filename += QDateTime::currentDateTime().toString("yyyy-MM-dd hhmmss");
filename += ".jpg";
//如果没有指定区域,就默认是screen的范围
QPixmap pix = screen->grabWindow(0, area.x(), area.y(), area.width(), area.height());
if(pix.isNull() || !pix.save(filename, "jpg")) {
    qDebug()<<"screenshot failed";
}

2.QSettings 用不同的编码写不同字段会导致中文乱码

因为配置文件需要先读取并解析,更新值后重新覆写整个文件,不是直接插入到中间的,所以用不同的编码读取后,中文字符已经解析错误了,即使更新的不是乱码的字段,但由于是整个文件重新写入,所以还是会乱码。

3.QPrinter 打印出来边上被截成空白

设置 setFullPage(true),这样就不会被截掉边上的内容

QPrinter printer(QPrinter::ScreenResolution);
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPageSize(QPageSize(QPageSize::A4));
printer.setFullPage(true);

4.Qt DPI 适配

虽然 Qt 提供了一堆 DPI 相关的设置,但都不尽人意,经过测试,感觉勉强能用的就是通过 qt.conf 的配置来设置,该方法放大的比例大致是对的,就是有点模糊。

//在可执行文件同目录下新建文件 qt.conf 填入下面内容
[Platforms]
WindowsArguments = dpiawareness=0

如果配置文件没效果可以代码加上 AA_EnableHighDpiScaling 的设置,两者都存在时,qt.conf 的优先级更高。 

这里贴上刘典武大佬总结的一些 DPI 适配的方法:

//方法1:在main函数的最前面加上下面这句 5.6版本才开始有这个函数
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    //开启高缩放支持以后图片可能发虚还要开启下面这个属性
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif

//方法2:在可执行文件同目录下新建文件 qt.conf 填入下面内容
[Platforms]
WindowsArguments = dpiawareness=0
//下面这行用来解决Qt高DPI下文字显示有锯齿的问题
WindowsArguments = fontengine=freetype
//2023-2-2 两行分开写没有效果,需要逗号分开
WindowsArguments = dpiawareness=0, fontengine=freetype

//方法3:在main函数最前面设置Qt内部的环境变量
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1.5");

//方法4:新版本的Qt比如Qt5.14修正了对高分屏的处理支持不是整数的缩放
qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

//禁用缩放
//测试发现AA_Use96Dpi属性在Qt5.9以上版本完全正常,以下版本比如5.7有部分控件在175%缩放不正常比如QTextEdit,需要外层套个widget才行。
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    QApplication::setAttribute(Qt::AA_Use96Dpi);
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0))
    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif

猜你喜欢

转载自blog.csdn.net/gongjianbo1992/article/details/128824396