2013-05-09 4 views
2

Я наткнулся на это в документации QMainWindow::setMenuBar(QMenuBar * menuBar):QMainWindow и право собственности захват политика

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

Пример кода (в методе класса, производный от QMainWindow):

QMenuBar * menuBar = new QMenuBar(this); 
setMenuBar(menuBar) // <-- immediately transfer ownership 
// use menuBar pointer to add actions, menus, and what not 

Могу ли я рассчитывать на локальный указатель на моей QMenuBar после вызова setMenuBar? Я имею в виду, это полностью гарантировано?

Когда я удалить мой QMainWindow производный класс, объект QMenuBar также удаляется, потому что QMainWindow установлен в качестве его родителя при построении его - но то, что политика заключается в более позднем «собственности захвата» через setMenuBar, кроме копии справки/указатель?

ответ

1

Да, это безопасно использовать этот указатель до тех пор, пока объект, который взял владение, жив.

Тот факт, что QMainWindow «принимает на себя владение» в меню означает, что он позаботится о его удалении, когда он больше не понадобится. Это очень распространено для Qt, см. Документацию Object Trees & Ownership.

Это, как говорится, ваш пример кода можно переписать так:

QMenuBar *menu = menuBar(); 

Это будет create an empty menu, если это необходимо, так что вам не придется беспокоиться о передаче права собственности. Просто вызовите эту функцию-член, когда вам нужно действовать в строке меню Windows.

+0

Я мог бы просто использовать ваш подход, кажется чище. Так что, например, мой двухстрочный код-пример избыточен? Если конструктор QMenuBar получает указатель на QMainWindow, нужен ли позднее вызов setMenuBar? –

+0

Если вы используете 'menuBar()', вам не нужно 'setMenuBar()', строка меню, которую вы получаете, уже хорошо подходит. Вы должны использовать это, если вы не заметите, что заметка о совместном использовании Mac OSX и меню в этом документе, который я связал, касается вас. – Mat

+0

Исправление: 'menuBar' не' getMenuBar' - правильно? –

Смежные вопросы