Как заставить QMenu реагировать на изменения размера текста на экранах с высоким разрешением

Текст в меню и меню автоматически изменяет размер при перемещении окна с экрана с разрешением 96 т / д на экран с разрешением 192 т / д. Я наивно думал, что Qt автоматически изменит размер меню, когда размер текста меню изменится, но я, очевидно, здесь не прав.

  1. Как я могу заставить QMenuBar и QMenu изменять размер при изменении размера текста? (В частности, когда окно перетаскивается на экран с разрешением 192 dpi)

Размер текста изменяется только при перемещении окна на экран с разрешением 192 dpi. Если окно первоначально отображается на экране 192, оно нарисует меньший текст с разрешением 96 точек на дюйм.

  1. Как убедиться, что текст имеет правильный размер, когда главное окно открывается на экране с разрешением 192 dpi?

Я тестировал игру с переменной env QT_DEVICE_PIXEL_RATIO, но это ничего не решает. Я могу заставить меню увеличиваться, установив значение 2, но мне нужно, чтобы они меняли размер в зависимости от используемого экрана. И приложение должно быть Per-Monitor DPI Aware в Windows, поэтому оставить его на усмотрение диспетчера окон в автоматическом режиме невозможно.

Я также проверил это со стилем Fusion, чтобы исключить его связь с родным стилем Windows.

введите описание изображения здесь

Тривиальный контрольный пример:

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QStyle>
//#include <QStyleFactory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //a.setStyle((QStyleFactory::create(("Fusion"))));

    QMainWindow w;

    QMenuBar *menuBar = w.menuBar();

    QMenu *menuFile = menuBar->addMenu("File");
    QMenu *menuEdit = menuBar->addMenu("Edit");
    QMenu *menuCompany = menuBar->addMenu("&Company");
    QMenu *menuArrange = menuBar->addMenu("Arrange");

    // file menu
    menuFile->addAction(a.style()->standardIcon(QStyle::SP_DirOpenIcon), "Open", nullptr, nullptr, QKeySequence::Open);
    menuFile->addAction(a.style()->standardIcon(QStyle::SP_DriveFDIcon), "Save", nullptr, nullptr, QKeySequence::Save);
    QAction* actionQuit = menuFile->addAction("Quit");
    QObject::connect(actionQuit, &QAction::triggered, &w, &QMainWindow::close);
    // edit menu
    menuEdit->addAction(a.style()->standardIcon(QStyle::SP_ArrowLeft), "Undo", nullptr, nullptr, QKeySequence::Undo);
    menuEdit->addAction(a.style()->standardIcon(QStyle::SP_ArrowRight), "Redo", nullptr, nullptr, QKeySequence::Redo);
    // company menu
    menuCompany->addAction(a.style()->standardIcon(QStyle::SP_DriveNetIcon), "DB Connect", nullptr, nullptr, QKeySequence(Qt::SHIFT + Qt::Key_Insert));

    w.setCentralWidget(new QWidget);

    w.show();

    return a.exec();
}

1 ответ

Из приведенных выше изображений мы можем предположить, что вы имеете дело с Windows.

Как бы я попытался решить это? Давайте заставим приложение реагировать на WM_DPICHANGED. Это, вероятно, потребует от вас более подробного ознакомления с SetProcessDPIAware, IsProcessDPIAware и другими соответствующими функциями API. И что Qt может предложить в этом контексте.

Затем, перехватив изменение DPI, мы можем воспользоваться вызовами QWidget SaveGeometry / RestoreGeometry для этого объекта QMenu. Этот подход должен лишить законной силы контроль.

PS Виджеты Qt в целом хорошо адаптированы к динамическим изменениям размеров монитора, и я согласен с комментатором, что это, вероятно, ошибка.

Другие вопросы по тегам