如何确保QFrame标题通过Window 10的“使文本更大”缩放比例自动缩放?

时间:2020-01-06 00:15:13

标签: windows qt qdockwidget hdpi qframe

我有一个自QFrame继承的自定义面板实现。我可以使用setWindowTitle()函数设置标题。我注意到我无法设置该标题的字体大小,但是我希望该标题将根据Windows 10的文本缩放比例进行缩放。我使用的是4K显示器,希望文本可以通过Windows设置进行缩放,但事实并非如此。我同时设置了QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling)QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps),以便正确缩放整个应用程序和像素图像。

每个自定义面板的标题文本不受Window 10的“ 放大文本”设置的影响,而主应用程序窗口的标题文本可以正确缩放,而那些使用DrawText绘制的文本功能已正确缩放。但是,自定义窗口小部件的标题未正确缩放。像Visual Studio这样的其他应用程序,其标签和文本在“显示”设置的缩放比例之上通过“使文本更大”设置进行缩放。

我的自定义窗口小部件也已加载到QDockWidget中。我可以直接修改标题的字体大小,但希望可以像应用程序标题栏一样正确缩放。

有什么我可以解决的吗?

一个简化的代码示例,可帮助您了解问题: 我的主应用程序有一个ockockwidget,并附加了一个自定义“面板”(由QFrame或QWidget继承)。 (请参见下面的代码)

QDockWidget* dock = new QDockWidget(panel->Title(), this);
dock->setObjectName(panel->TypeId());
dock->setAllowedAreas(panel->AllowedDockAreas());
dock->setFeatures(dock->features() & ~QDockWidget::DockWidgetFloatable);
dock->setWidget(panel);
dock->setVisible(panel->DefaultVisible());
addDockWidget(panel->DefaultDockArea(), dock);

因此,如果我添加以下代码,则可以直接调整标题的字体大小,但这是我自己进行的手动更改。我想要的是让它根据Windows的文本缩放比例(例如150%,200%等)自动缩放

QFont f = dock->font();
f.setPointSizeF(f.pointSizeF()*devicePixelRatioF());
dock->setFont(f);

所以我的问题是如何或者是否有可能通过控制面板中的窗口10的文本缩放系数来缩放此自定义面板的标题(特别是在高dpi的情况下)?

更新: 我使用以下代码来获取标题栏的高度,并且令人惊讶的是,在任何比例因子下,应用程序的标题栏和自定义小部件的标题栏都给出了相同的值,尽管它们实际上看起来有所不同。当文本缩放比例更改时,这些数字也会更改。这是否意味着Window在处理缩放时实际上是Windows如何看待应用程序及其子窗口小部件的方式?

auto dw_style = dock->style();
int titleBarHeight = dw_style->pixelMetric(QStyle::PM_TitleBarHeight);
int titleBarMargin = dw_style->pixelMetric(QStyle::PM_DockWidgetTitleMargin);

std::cout << "Panel=" << panel->Title().toStdString() << ", titleBarHeight=" << titleBarHeight << std::endl;
std::cout << "Panel=" << panel->Title().toStdString() << ", titleBarMargin=" << titleBarMargin << std::endl;

auto main_style = this->style();
int main_titleBarHeight = main_style->pixelMetric(QStyle::PM_TitleBarHeight);
int main_titleBarMargin = main_style->pixelMetric(QStyle::PM_DockWidgetTitleMargin);
std::cout << "TMainForm=" << this->windowTitle().toStdString() << ", main_titleBarHeight=" << main_titleBarHeight << std::endl;
std::cout << "TMainForm=" << this->windowTitle().toStdString() << ", main_titleBarMargin=" << main_titleBarMargin << std::endl;

Update2:

由于更高版本的Qt5(Qt5.12.6)为我解决了该问题,因此我从Qt论坛获得了一个相当不错的解决方案(就像我在Qt5.6.1上一样)。显然已经进行了很多改进,以帮助在高dpi监视器环境中使用。但是有趣的是,在新的更新中,Qt决定缩放小部件的标题,而不是主应用程序标题。

该解决方案绝对与如何创建一个可以与Windows Manager正常工作的小部件有关,如果我想手动使它发生并且肯定不确定我是否可以在Qt环境中做到这一点。 QDockwidget允许我们设置自定义标题栏,这可能是绕过旧版Qt中现有设置的唯一方法。

0 个答案:

没有答案