我有一个使用Qt styleSheet的Qt Widgets应用程序来获得应用程序的外观.我们希望添加对高DPI显示器的支持,因为这些应用看起来非常小.因此,第一步是:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
这可以完成大部分工作,应用程序窗口足够大.唯一剩下的问题是样式表中使用的图像的分辨率.
说我们有:
QCheckBox::indicator::unchecked {
image: url(:/res/checkbox_off.png);
}
MainWindow QFrame {
background-image: url(:/res/background.png);
}
Run Code Online (Sandbox Code Playgroud)
当使用高DPI缩放时,这些图像会相应地升级,这是一个问题.对于高DPI,我宁愿使用更高分辨率的图像,使它们看起来尽可能清晰.
正如所料,简单地以更高分辨率提供图像的简单方法不起作用 - 它使图像和控制的两倍大(在低和高DPI屏幕上).
关于QImageReader的Qt文档说明了这一点
高分辨率版本在基本名称上标有后缀@ 2x.读取的图像将其设备像素比率设置为值2.
但是,我提供了两倍分辨率的这些资源,将它们添加到qrc文件中,但在pixel_ratio为3的设备上显示的图像仍然相同.
是否还需要其他步骤才能使自动图像加载与样式表一起使用?
我知道我们必须QMAKE_EXTRA_TARGETS创建新的 makefile 目标,使用如下(见http://blog.qt.io/blog/2008/04/16/the-power-of-qmake/):
conv.target=convert
conv.input=file.in
conv.output=file.out
conv.commands=convert.sh file.in file.out
QMAKE_EXTRA_TARGETS+=conv
Run Code Online (Sandbox Code Playgroud)
在我的情况下,convert.sh用于多个文件和目标。我想创建一个带有参数(target_name、input_file、output_file)的方法,它为我创建任务,这样我就不必重复以上几行了。
qmake 的文档相当缺乏,或者我没有找到正确的来源,但据我所知,qmake 中有两种类型的函数:replace 和 test ( http://doc.qt.io/qt-5/ qmake-language.html#replace-functions),我们可以使用defineReplace和创建自定义的defineTest。
我试过了:
defineTest(createConvertTask) {
custom.target = $$1
custom.input = $$2
custom.output = $$3
custom.commands = convert.sh $$2 > $$3
QMAKE_EXTRA_TARGETS += custom
}
Run Code Online (Sandbox Code Playgroud)
但这并没有真正起作用,因为在createConvertTask多次调用之后,QMAKE_EXTRA_TARGETS只会包含 string 的多个副本custom。
然而,这
defineTest(createConvertTask) {
$$1.target = $$1
$$1.input = $$2
$$1.output = $$3
$$1.commands = convert.sh $$2 > $$3
QMAKE_EXTRA_TARGETS …Run Code Online (Sandbox Code Playgroud)