如何在Qt 5.6中获得高DPI下清晰的UI?

25

我正在使用一台4k显示器进行开发,这真是令人头痛...

最终我设法设置好了QtDesigner,然后遇到了以下问题:

如果您使用QT_AUTO_SCREEN_SCALE_FACTOR=1并编译一个带有单选按钮和其他基本小部件的应用程序,则在4k屏幕上会看起来缩放了。 否则,控件的尺寸是正确的且如预期般,只是不够清晰,而是有些像素化。

我正在运行Windows 10 Home 64位,使用一台4k屏幕,200% DPI缩放,使用Qt 5.6 RC msvc2015 64位,并尝试使用相同的结果。

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

dcreenshot

如果我使用

QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling);

控制元素很清晰,文本大小适中,但是所有尺寸都要小得多。

如何在高DPI屏幕上使控件更加清晰?


1
我通常使用小部件的样式表来实现:https://dev59.com/apLea4cB1Zd3GeqP0k41#34408516 或者我使用QML UI。 - Alexander V
1
我之前看过你的回复,但是这并不像大家谈论的本机高 DPI 支持。我期望这是自动完成的,为什么控件会像素化而没有清晰地渲染呢?如果这是标准行为,那么为什么所有官方来源都要推荐它呢? - michnovka
由于我们有一个相当大的代码库,我们不急于转换到Qt 5.6,并认为5.5足够稳定。您基本上刚刚发现了启用AA_EnableHighDpiScaling模式所带来的优势。如果您使用QML,那将会非常不同但锐利。请注意缩放QML矩形属性。更多信息请参见https://doc-snapshots.qt.io/qt5-5.6/highdpi.html。 - Alexander V
1
使用QML并不能解决在Windows上的问题。我正在开发一个5.6版本的应用,在Mac上一切都很完美(感谢操作系统),但在Windows上...我甚至不想去尝试...只为了Windows启用QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)就可以解决一些问题,但实际上,当您开始使用具有不同分辨率的多个监视器时,它会引入一整套新问题。当Qt的开发者表示5.6支持高分辨率屏幕时,这其实是个谎言。存在着许多问题和错误报告,并且看起来它们不会很快被修复。 - Silex
1
你能否尝试设置setAttribute(Qt::AA_UseHighDpiPixmaps); - Petr
显示剩余3条评论
3个回答

7

如Qt文档所述:

Use QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.
QT_SCREEN_SCALE_FACTORS to set per-screen factors.
QT_SCALE_FACTOR to set the application global scale factor.

你可以尝试做Qt Creator正在做的事情:
static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO";
if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO)
        && !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR")
        && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR")
        && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) {
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}

基本上,最重要的一行是QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

该行代码涉及到it技术。

3
以下是对我有效的操作方式。您可以通过在QApplication实例化时给出命令行选项来手动设置DPIawareness。
官方文档在此https://doc.qt.io/qt-5/highdpi.html(DPI感知部分)。
根据文档,您可以将应用程序设置为DPI无感知(因此它将自动缩放但显示模糊),或设置为系统DPI感知或逐像素点感知。
以下是一个最小示例代码,用于强制高DPI的QApplication实例化,并选择除1以外的其他值(0或2)以启用DPIUnaware或Per Monitor DPI Aware:
int main() 
{
   int argc = 3;
   char*argv[] = {(char*)"Appname", (char*)"--platform", (char*)"windows:dpiawareness=1";
   (void) new QApplication(argc, argv);
}

2
使用QT_AUTO_SCREEN_SCALE_FACTOR,字体的点大小不会发生变化,它们只是从原始像素缩放,所以它们永远不会变得平滑,只会更加粗糙。
参考文献:http://doc.qt.io/qt-5.6/highdpi.html#high-dpi-support-in-qt“这不会改变点大小字体的尺寸”。
您需要使用QT_SCALE_FACTOR来重新调整您的应用程序,而不仅仅是重新调整其像素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接