更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小变得更大
Posted
技术标签:
【中文标题】更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小变得更大【英文标题】:Changing DPI scaling size of display make Qt application's font size get rendered bigger 【发布时间】:2013-12-26 05:15:59 【问题描述】:我已经使用 Qt 创建了一些 GUI 应用程序。我的 GUI 应用程序包含按钮和单选按钮等控件。当我运行应用程序时,按钮内的按钮和字体看起来很正常。当我将显示的 DPI 缩放大小从 100% 更改为 150% 或 200% 时,无论分辨率如何,控件的字体大小都会呈现更大,但控件大小(按钮、单选按钮)却不会。因此,控件内的文本被截断。请看附图。
DPI 缩放大小设置为 100% 时的 Qt 应用程序外观
DPI 缩放大小设置为 200% 时的 Qt 应用程序外观
我也在一些平板电脑上运行我的应用程序。在平板电脑中,DPI 比例值应大于 150%,否则一切都会显示得非常小。
我在网上搜索了在 Qt 中创建 UI 应用程序,无论分辨率和 DPI 比例值如何,但没有运气。所以我在这里发布我的任务。请让我知道是否有办法摆脱这种情况。
【问题讨论】:
我有同样的问题,你有任何解决这个问题的方法,并且没有使用qt5.6版本,请帮助我 【参考方案1】:从 Qt 5.6 开始启用高 DPI 支持。
在您的应用程序源代码中设置 QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)
允许自动高 DPI 缩放。
注意:要使用属性方法,必须在创建QApplication
对象之前设置属性:
#include <QApplication>
int main(int argc, char *argv[])
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
return app.exec();
【讨论】:
我有同样的问题,你有任何解决这个问题的方法,并且没有使用qt5.6版本,请帮助我 感谢您的通知! 完美答案。 在我的 Qt 5.8 应用程序中执行此操作 - 但它没有解决我的问题:cms.bgu.tum.de/oip/dpiProblems.png 为我工作,谢谢!仅供参考,我使用的是 QWidgets 而不是 QML。【参考方案2】:正确使用布局会有所帮助。
http://qt-project.org/doc/qt-4.8/layout.html
告诉操作系统您处理 DPI 更改,将防止您未预料到的奇怪字体更改。
http://msdn.microsoft.com/en-us/library/ms701681(v=vs.85).aspx
对于间隔关键位置,您可以检查渲染字体的大小,然后根据生成的文本大小设置对象的最小大小。
http://qt-project.org/doc/qt-4.8/qfontmetrics.html#details
https://blog.qt.digia.com/blog/2009/06/26/improving-support-for-higher-dpi-on-vista/
您可以尝试使用 Qt 中的其他内置测量进行检查:
http://qt-project.org/doc/qt-4.8/qpaintdevice.html#widthMM
http://qt-project.org/doc/qt-4.8/qpaintdevice.html#logicalDpiX
如果您使用的是 QML,请尝试仅基于锚点放置的原始布局。
http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html
QApplication
有一些有些相关的设置。
http://qt-project.org/doc/qt-4.8/qapplication.html#setDesktopSettingsAware
您也可以手动指定字体。
http://qt-project.org/doc/qt-4.8/qapplication.html#setFont
希望对您有所帮助。
【讨论】:
您提供的第二个链接只能在 Windows 中使用,对吧?是否可以在 QT 中使用该 API?它可以在所有其他平台上运行吗? 是的,这是 Windows 特定的。其他操作系统可能也有类似的情况,但我不知道。 只要是为 Windows 编译,就可以使用 Windows API 调用。在 Windows 之外使用 Window 的调用不会编译。 我有同样的问题,你有任何解决这个问题的方法,并且没有使用qt5.6版本,请帮助我【参考方案3】:我有一个固定大小的窗口,当 Windows 可访问性设置应用于放大所有文本大小时,它的大小不足以容纳它包含的所有文本。 Windows 通过增加 dpi 来做到这一点。我通过检索 os 缩放因子解决了这个问题,然后调整了我的窗口的大小和它的一些布局(由于某种原因我无法自动缩放)。
这是我获得 dpi 比例的方法(在一个名为“WindowsDpiScale.h”的文件中):
#ifndef WINDOWSDPISCALE_H
#define WINDOWSDPISCALE_H
#include <QtGlobal>
#ifdef Q_OS_WIN
#include <windows.h>
const float DEFAULT_DPI = 96.0;
float windowsDpiScale()
HDC screen = GetDC( 0 );
FLOAT dpiX = static_cast<FLOAT>( GetDeviceCaps( screen, LOGPIXELSX ) );
ReleaseDC( 0, screen );
return dpiX / DEFAULT_DPI;
#endif //Q_OS_WIN
#endif // WINDOWSDPISCALE_H
然后,我是如何应用它的:
...
#include "WindowsDpiScale.h"
MainWindow::MainWindow( QWidget *parent )
: QMainWindow( parent )
...
// Enlarge the window and various child widgets to accomendate
// OS display scaling (i.e. accessibily options)
setScaleToOsSettings();
...
void MainWindow::setScaleToOsSettings()
#ifdef Q_OS_WIN
setScale( windowsDpiScale() );
#endif
void MainWindow::setScale( float scale )
// Resize the window
this->setFixedSize( (int)(scale * this->maximumWidth()),
(int)(scale * this->maximumHeight()) );
// Resize the layouts within the stacked widget
foreach( QVBoxLayout * layout,
windowUi_->pagerStackedWidget->findChildren<QVBoxLayout *>() )
layout->parentWidget()->setFixedSize(
(int)(scale * layout->parentWidget()->contentsRect().width()),
(int)(scale * layout->parentWidget()->contentsRect().height()) );
【讨论】:
你试过我的解决方案了吗?它不依赖于 Qt 版本。它只是从 Windows 获取“缩放因子”。然后由你来调整你的小部件的大小 - 正如我在我的例子中展示的那样。 它可以在 Linux 平台上运行吗?我在 Linux 平台上使用 Qt。 请仔细阅读我的回答。这是我发布的 Windows 解决方案。但是,它可以在概念上应用于任何平台。将我的 WindowsDpiScale.h 替换为在 Linux 中使用本机代码的文件,以获取该平台上的 dpi 和相对比例。【参考方案4】:这是一个解决方法:
创建一个文件qt.conf
并将这些行添加到其中。
[Platforms]
WindowsArguments = dpiawareness=0
将此文件放在应用程序二进制文件夹中。就这样。它会很好用,但唯一的问题是外观不会那么清晰。 要将其交付给客户,请将此文件添加到您拥有依赖文件的位置,并在创建设置时,就像通常运行依赖文件一样,也运行它。
【讨论】:
【参考方案5】:在处理高分辨率显示器时有多种选择:
-
什么都不做,以高分辨率进行开发。最终,更高的分辨率成为新的标准,每个人都会得到 13-15-17 英寸。它在 2000 年确实有效,不是吗?
留给操作系统。例如,Windows 有一个特殊的兼容性设置,可以将所有内容缩放到正确的大小,同时让应用程序认为它呈现的是低分辨率显示。这在 Windows 上称为 DPI Unaware。
尝试使用 Qt 功能,QT_AUTO_SCREEN_SCALE_FACTOR=0,QT_SCALE_FACTOR=1。
通过将 QT_AUTO_SCREEN_SCALE_FACTOR 设置为 1 或相应的 AA_EnableHighDpiScaling 属性(在 Qt 5.6 中引入)来使用 Qt 的一点帮助。这将相对于字体大小缩放小部件大小,因此您只需要处理光栅图像。
关闭 AA_EnableHighDpiScaling 并重新考虑所有像素大小,方法是使它们相对于字体大小或将它们与设备像素比相乘。
对上一步的改进:考虑到每个显示器上的设备像素比,以便当您将 UI 移动到另一个显示器时,它会适当地缩放。
来源:
https://doc.qt.io/qt-5/scalability.html https://doc.qt.io/qt-5/highdpi.html https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows【讨论】:
以上是关于更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小变得更大的主要内容,如果未能解决你的问题,请参考以下文章