更改显示的DPI缩放大小使Qt应用程序字体大小变得更大

时间:2013-12-09 06:52:05

标签: c++ qt user-interface resolution dpi

我使用Qt创建了一些GUI应用程序。我的GUI应用程序包含按钮和单选按钮等控件。当我运行应用程序时,按钮内的按钮和字体看起来很正常。当我将显示器的DPI缩放尺寸从100%更改为150%或200%时,控件的字体大小变大但控制尺寸(按钮,单选按钮)无论分辨率如何。因此,内部控件中的文本被切断。请参阅附图。

当DPI缩放大小设置为100%时Qt应用程序显示

Qt application look when DPI scaling size set to 100%

当DPI缩放大小设置为200%时,Qt应用程序显示

Qt application look when DPI scaling size set to 200%

我也在某些平板电脑上运行我的应用程序。在平板电脑中,DPI刻度值应该超过150%,否则一切都会显得非常小。

我在网上搜索了在Qt中创建UI应用程序,无论分辨率和DPI比例值如何,但没有运气。所以我在这里发布我的任务。如果有办法摆脱这种情况,请告诉我。

5 个答案:

答案 0 :(得分:17)

从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();
}

答案 1 :(得分:8)

正确使用布局可以提供帮助。

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

希望有所帮助。

答案 2 :(得分:5)

我有一个固定大小的窗口,当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()) );
}

答案 3 :(得分:1)

这是一种解决方法。创建文件“ qt.conf”。 将这些行添加到其中。

[平台]

WindowsArguments = dpiawareness = 0

将此文件放在应用程序二进制文件夹中。它将很好地工作,但唯一的问题是外观不会那么清晰。 为了将其交付给客户,请将该文件添加到您的依赖文件所在的位置,并在创建设置时像正常情况下运行您的依赖文件一样,也要同样运行。

答案 4 :(得分:0)

处理高分辨率显示时有几种选择:

  1. 不采取任何行动,并以高分辨率发展。最终,更高的分辨率成为新的标准,每个人都将获得13-15-17英寸。它在2000年确实有效,不是吗?
  2. 将其留给操作系统。例如,Windows有一个特殊的兼容性设置,可以将所有内容缩放到正确的大小,同时让应用程序认为它呈现的是低分辨率的显示。这在Windows上称为DPI Unaware。
  3. 尝试使用Qt功能,QT_AUTO_SCREEN_SCALE_FACTOR = 0,QT_SCALE_FACTOR = 1。
  4. 通过将QT_AUTO_SCREEN_SCALE_FACTOR设置为1或相应的AA_EnableHighDpiScaling属性(在Qt 5.6中引入),可以使用Qt的帮助。这将根据字体大小缩放窗口小部件的大小,因此您只需要处理光栅图像。
  5. 关闭AA_EnableHighDpiScaling并通过将它们与字体大小相关或乘以设备像素比率来重新考虑所有像素大小。
  6. 对上一步的改进:考虑到每个显示器上的设备像素比率,以便在将UI移至另一台显示器时适当缩放UI。

来源: