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

Aru*_*run 33 c++ user-interface qt resolution dpi

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

当DPI缩放大小设置为100%时,Qt应用程序看起来

当DPI缩放大小设置为100%时,Qt应用程序看起来

当DPI缩放大小设置为200%时,Qt应用程序看起来

当DPI缩放大小设置为200%时,Qt应用程序看起来

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

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

Nic*_*aus 19

从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();
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的 Qt 5.8 应用程序中执行此操作 - 但它没有解决我的问题:https://www.cms.bgu.tum.de/oip/dpiProblems.png (2认同)

phy*_*att 9

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

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

希望有所帮助.


Buv*_*inJ 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
Run Code Online (Sandbox Code Playgroud)

然后,我在我的案例中如何应用它:

...
#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()) );
}
Run Code Online (Sandbox Code Playgroud)