Qt: QMainWindow становится владельцем QMenuBar

#qt #user-interface

#qt #пользовательский интерфейс

Вопрос:

Я хотел бы использовать единственный экземпляр QMenuBar, чтобы упростить интеграцию с Mac OS X, однако в документации указано

Примечание: QMainWindow становится владельцем указателя на строку меню и удаляет его в соответствующее время.

Как я могу заставить все мои QMainWindows совместно использовать один QMenuBar? Или это простой и неудачный ответ «вы не можете»?

Ответ №1:

Извините, что просто цитирую руководство, но этот вопрос действительно уже рассмотрен в нем.

http://doc.qt.nokia.com/latest/qmainwindow.html#menuBar:

Если вы хотите, чтобы все окна в приложении Mac совместно использовали одну строку меню, не используйте эту функцию для ее создания, потому что в строке меню, созданной здесь, это QMainWindow будет родительским. Вместо этого вы должны создать строку меню, у которой нет родительского элемента, который затем можно использовать совместно со всеми окнами Mac. Создайте строку меню без родительских элементов таким образом:

 QMenuBar *menuBar = new QMenuBar(0);
  

Дополнительная информация о QMenuBar в Mac OS X:

Комментарии:

1. «которым затем вы можете поделиться со всеми Mac Windows»… но если отдельные окна получают право собственности на меню, как они могут совместно использовать его?

2. Вы не связываете эту панель меню ни с каким окном. Отдельные окна не станут владельцами меню, потому что вы не передадите его им. Вы создаете панель меню без родителей на одном шаге, затем на другом шаге создаете свое QMainWindow. Вы никогда не вызываете QMainWindow::menubar().

3. В конечном итоге QMainWindow вообще не имеет меню. Он не видит нулевую родительскую строку QMenuBar. т. Е. я запускаю приложение и не вижу строки меню в окне, пока не вызову setMenuBar(globalMenuBar) .

4. Нигде не вызывайте setMenubar() или menubar(). Убедитесь, что нет кода, вызывающего эти методы, особенно menubar(), поскольку это создаст пустую строку меню для этого окна, которая переопределит глобальную строку меню по умолчанию.

5. Я добавил больше ссылок на ответ. Проверьте последний, в котором объясняется, когда Windows возвращается к использованию строки меню по умолчанию и как строка QMenuBar без родительского элемента используется в качестве строки меню по умолчанию для приложения.