0

我有一个自定义面板实现,它继承自QFrame. 我可以使用该setWindowTitle()功能设置标题。我注意到我无法设置此标题的字体大小,但我期待此标题将根据 Windows 10 的文本缩放进行缩放。我使用的是 4K 显示器,我希望文本可以通过 Windows 设置进行缩放,但似乎并非如此。我已经设置了两者QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling)QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps)因此整个应用程序和像素图像都正确缩放。

每个自定义面板的标题文本不受 Window 10 的“使文本变大”设置的影响,而主应用程序窗口的标题文本被正确缩放,使用 DrawText 函数绘制的那些文本被正确缩放。但是,我的自定义小部件的标题未正确缩放。Visual Studio 等其他应用程序的标签和文本由“显示设置”缩放顶部的“使文本更大设置”缩放。

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

我能做些什么来解决这个问题吗?

帮助您理解问题的简化代码示例:我的主应用程序有一个 dockwidget 和一个自定义“面板”(由 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 实际上是如何看待应用程序及其附属小部件的?

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;

更新2:

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

如果我想手动实现它并且当然不确定我是否可以在 Qt 环境中做到这一点,那么该解决方案肯定与如何创建一个与 Windows 管理器一起正常工作的小部件有关。QDockwidget 让我们设置自定义标题栏,这可能是绕过旧 Qt 版本中现有设置的唯一方法。

4

0 回答 0