我使用Qt创建了一些GUI应用程序。我的GUI应用程序包含按钮和单选按钮等控件。当我运行应用程序时,按钮内的按钮和字体看起来很正常。当我将显示器的DPI缩放尺寸从100%更改为150%或200%时,控件的字体大小变大但控制尺寸(按钮,单选按钮)无论分辨率如何。因此,内部控件中的文本被切断。请参阅附图。
当DPI缩放大小设置为100%时Qt应用程序显示
当DPI缩放大小设置为200%时,Qt应用程序显示
我也在某些平板电脑上运行我的应用程序。在平板电脑中,DPI刻度值应该超过150%,否则一切都会显得非常小。
我在网上搜索了在Qt中创建UI应用程序,无论分辨率和DPI比例值如何,但没有运气。所以我在这里发布我的任务。如果有办法摆脱这种情况,请告诉我。
答案 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)
处理高分辨率显示时有几种选择:
来源: