首页 文章

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

提问于
浏览
29

我用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比例值如何,但没有运气 . 所以我在这里发布我的任务 . 如果有办法摆脱这种情况,请告诉我 .

3 回答

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

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

    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

    希望有所帮助 .

  • 8

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

相关问题