私のアプリケーションは、複数の「ページ」に QTabWidget を使用します。トップレベルのメニューは、ユーザーがどのページにいるかに応じて変化します。
私の問題は、メニュー バーの内容を再作成しようとすると、表示に重大な問題が発生することです。Mac OS X を除くすべてのプラットフォームで、1 番目と 3 番目のスタイル (2 番目はテストしていませんが、そのスタイルは使用したくない) で期待どおりに動作します。
最初のメニューは、私がアプリケーションで作成するほとんどの方法で作成され、正しいタイトルを受け取りますが、メニューが再作成されるとすぐに消えます。
2 番目のメニューは、メニュー バーの最初の作成と再作成の両方に表示されますが、どちらの場合も「無題」というラベルが付いています。2 番目のメニューのスタイルは、これを解決しようとしたときにのみ作成されたため、メニューを固定できる唯一の方法です。
3 番目の動的メニューは表示されません。表示しようとしているメニューを動的に設定するために、このスタイルを使用します。
QMenuBar を削除して再作成しようとしました
m_menuBar = new QMenuBar(0);
とは対照的にm_menuBar->clear()
それを使用しますが、同じ動作をします。
画像をインラインで投稿するほどの評判はないので、imgur のリンクを含めます。
起動動作: http://i.imgur.com/ZEvvGKl.png
投稿ボタンクリック動作: http://i.imgur.com/NzRmcYg.png
Qt 5.3 を搭載した Mac OS X 10.9.4 でこの動作を再現する最小限の例を作成しました。
メインウィンドウ.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
m_menuBar = new QMenuBar(0);
m_dynamicMenu = new QMenu("Dynamic");
connect(m_dynamicMenu, SIGNAL(aboutToShow()), this, SLOT(updateDynamicMenu()));
changeMenuBar();
QPushButton *menuBtn = new QPushButton("Test");
connect(menuBtn, SIGNAL(clicked()), this, SLOT(changeMenuBar()));
setCentralWidget(menuBtn);
}
void MainWindow::changeMenuBar() {
m_menuBar->clear();
// Disappears as soon as this is called a second time
QMenu *oneMenu = m_menuBar->addMenu("One");
oneMenu->addAction("foo1");
oneMenu->addAction("bar1");
oneMenu->addAction("baz1");
// Stays around but has 'Untitled' for title in menu bar
QMenu *twoMenu = new QMenu("Two");
twoMenu->addAction("foo2");
twoMenu->addAction("bar2");
twoMenu->addAction("baz2");
QAction *twoMenuAction = m_menuBar->addAction("Two");
twoMenuAction->setMenu(twoMenu);
// Never shows up
m_menuBar->addMenu(m_dynamicMenu);
}
void MainWindow::updateDynamicMenu() {
m_dynamicMenu->clear();
m_dynamicMenu->addAction("foo3");
m_dynamicMenu->addAction("bar3");
m_dynamicMenu->addAction("baz3");
}
メインウィンドウ.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
private slots:
void changeMenuBar();
void updateDynamicMenu();
private:
QMenuBar *m_menuBar;
QMenu *m_dynamicMenu;
};
#endif // MAINWINDOW_H