当窗口从 96 dpi 屏幕移动到 192 dpi 屏幕时,菜单栏和菜单中的文本会自动改变大小。我天真地认为当菜单文本大小改变时 Qt 会自动调整菜单大小,但我在这里显然错了。
- 当文本改变大小时,如何让 QMenuBar 和 QMenu 改变大小?(具体是窗口拖到192dpi屏幕时)
仅当我将窗口移动到 192 dpi 屏幕时,文本大小才会发生变化。如果窗口最初显示在 192 屏幕上,它将绘制较小的 96 dpi 文本。
- 当主窗口在 192 dpi 屏幕上打开时,如何确保文本大小正确?
我已经测试过使用 QT_DEVICE_PIXEL_RATIO 环境变量,但这并不能解决任何问题。我可以通过将值设置为 2 来强制菜单变大,但我需要它们根据使用的屏幕更改大小。并且该应用程序必须是 Windows 上的 Per-Monitor DPI Aware,因此不能将其留给窗口管理器自动缩放。
我还使用 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();
}