3

ウィンドウが 96 dpi 画面から 192 dpi 画面に移動すると、メニューバーとメニュー内のテキストのサイズが自動的に変更されます。メニューのテキスト サイズが変更されたときに Qt が自動的にメニューのサイズを変更すると単純に考えていましたが、ここでは明らかに間違っています。

  1. テキストのサイズが変更されたときに QMenuBar と QMenu のサイズを変更するにはどうすればよいですか? (特に、ウィンドウを 192 dpi の画面にドラッグした場合)

ウィンドウを 192 dpi の画面に移動した場合にのみ、テキストのサイズが変わります。ウィンドウが最初に 192 画面に表示されている場合、小さい 96 dpi のテキストが描画されます。

  1. メインウィンドウが 192 dpi の画面で開いたときに、テキストが正しいサイズであることを確認するにはどうすればよいですか?

QT_DEVICE_PIXEL_RATIO 環境変数をいじってみましたが、何も解決しません。値を 2 に設定することでメニューを強制的に大きくすることができますが、使用中の画面に応じてサイズを変更する必要があります。また、アプリケーションは Windows ではモニターごとの DPI 対応である必要があるため、ウィンドウ マネージャーの自動スケールに任せることはできません。

また、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();
}
4

1 に答える 1