Как обеспечить автоматическое масштабирование заголовка QFrame с помощью масштабирования «Увеличить текст» в Window 10? - PullRequest
0 голосов
/ 06 января 2020

У меня есть пользовательская реализация панели, унаследованная от QFrame. Я могу установить заголовок с помощью функции setWindowTitle(). Я заметил, что не могу установить размер шрифта этого заголовка, но я ожидал, что этот заголовок будет масштабироваться на основе масштабирования текста Windows 10. Я использую монитор 4K и надеюсь, что текст можно масштабировать с помощью параметра windows, но это не так. Я установил QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling) и QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps), чтобы все приложение и пиксельные изображения масштабировались правильно.

На текст заголовка каждой пользовательской панели не влияет параметр « Сделать текст больше » в Window 10, в то время как текст заголовка основного приложения windows масштабируется должным образом, и этот текст это нарисовано, используя функции 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% и т. Д. 1039 *)

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

Так что мой вопрос: как это сделать или нет? Можно ли масштабировать заголовок этой пользовательской панели по коэффициенту масштабирования текста окна 10 на панели управления (особенно в ситуации с высоким разрешением)?

Обновление: Я использовал следующее Код для получения высоты строки заголовка и, что удивительно при любом коэффициенте масштабирования, строка заголовка приложения и строка заголовка пользовательского виджета выдает одинаковое значение, несмотря на то, что они на самом деле выглядят по-разному. Эти числа меняются при изменении коэффициента масштабирования текста. Означает ли это, что на самом деле 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;

Update2:

Я получил достаточно хорошее решение от Форум Qt как более поздняя версия Qt5 (Qt5.12.6) решает проблему для меня (как я был на Qt5.6.1). По-видимому, было сделано много улучшений, чтобы помочь использованию в среде с высоким разрешением на дюйм. Но что интересно, в новом обновлении Qt решает масштабировать заголовок виджета, но не заголовок основного приложения.

Решение, безусловно, связано с тем, как правильно создать виджет, который работает с Windows Manager. если я хочу сделать это вручную и, конечно, не уверен, смогу ли я сделать это в среде Qt. QDockwidget позволяет нам устанавливать пользовательские заголовки, которые могут быть единственным способом обойти существующие настройки в более старой версии Qt.

...