В моем приложении используется QTabWidget для нескольких «страниц», где меню верхнего уровня меняется в зависимости от того, на какой странице находится пользователь.
Моя проблема заключается в том, что попытка воссоздать содержимое строки меню приводит к серьезным проблемам с отображением. Он работает, как и ожидалось, с первым и третьим стилем (второй не тестировал, но я бы не хотел использовать этот стиль) на всех платформах, кроме Mac OS X.
Первые меню создаются так, как я больше всего создаю в приложении, и они получают правильное название, но исчезают, как только меню создается заново.
Второе меню появляется как при первоначальном заполнении, так и при повторном заполнении строки меню, но в обоих случаях имеет метку «Без названия». Стиль для второго меню был создан только при попытке решить эту проблему, так что это единственный способ сохранить меню.
Третье динамическое меню никогда не появляется, и точка. Я использую этот стиль для динамического заполнения меню, которое вот-вот появится.
Я попытался удалить QMenuBar и воссоздать его с помощью
m_menuBar = new QMenuBar(0);
и используя это в отличие от m_menuBar->clear()
, но он имеет такое же поведение.
У меня недостаточно репутации, чтобы публиковать встроенные изображения, поэтому я включу ссылки imgur:
Поведение при запуске: http://i.imgur.com/ZEvvGKl.png а>
Поведение при нажатии кнопки публикации: http://i.imgur.com/NzRmcYg.png
Я создал минимальный пример, чтобы воспроизвести это поведение в Mac OS X 10.9.4 с Qt 5.3.
mainwindow.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