Как заставить QMenu реагировать на изменения размера текста на экранах с высоким разрешением
Текст в меню и меню автоматически изменяет размер при перемещении окна с экрана с разрешением 96 т / д на экран с разрешением 192 т / д. Я наивно думал, что Qt автоматически изменит размер меню, когда размер текста меню изменится, но я, очевидно, здесь не прав.
- Как я могу заставить QMenuBar и QMenu изменять размер при изменении размера текста? (В частности, когда окно перетаскивается на экран с разрешением 192 dpi)
Размер текста изменяется только при перемещении окна на экран с разрешением 192 dpi. Если окно первоначально отображается на экране 192, оно нарисует меньший текст с разрешением 96 точек на дюйм.
- Как убедиться, что текст имеет правильный размер, когда главное окно открывается на экране с разрешением 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 в целом хорошо адаптированы к динамическим изменениям размеров монитора, и я согласен с комментатором, что это, вероятно, ошибка.