2010-08-27 4 views
1

Я не понимаю, почему в книге Rapid GUI программирования с Python и Qt, контекстное меню добавляется в центральный виджет, вызвав addActions()в главном окне (self), например, так (стр 180.)Qt: лучший способ добавить контекстное меню в центральный виджет?

self.addActions(self.imageLabel, 
       (editInvertAction, …)) 

где self является QMainWindow и imageLabel является QLabel набор в качестве центрального виджета с

self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu) # Added actions will be put in a context menu 
self.setCentralWidget(self.imageLabel) 

Теперь, почему главное окно должно быть связано каким-то образом (через self.addActions()) в контекстное меню центрального виджета? Не достаточно ли позвонить addActions() прямо на центральный виджет? Фактически, следующее создает контекстное меню:

self.imageLabel.addActions((editInvertAction, …)) 

Почему книга не иллюстрирует контекстное меню таким образом? разве это не эквивалентно более формальной форме self.addActions(…)?

PS: Я даже вижу, что documentation for QMainWindow.addActions() даже не говоря уже о какой-либо первый аргумент (self.imageLabel выше)! Я полностью потерял, почему книга использует первый фрагмент выше, а не последний ... Помогите! :)

ответ

1

Использование self.addAction() в QMainWindow позволяет всем дочерним элементам QMainWindow (Docks, StatusBar, ToolBar, MenuBar, ...) использовать эти действия, а не только центральный виджет.

Но лучший способ получить тонкодисперсный элемент управления контекстным меню - использовать сигнал customContextMenuRequested (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#customContextMenuRequested).

+0

Спасибо! Действия, переданные центральному виджету, уже используются дочерними элементами QMainWindow (меню и т. Д.), И я не вижу контекстного меню вне центрального виджета. Итак, я не уверен, чтобы понять ваш ответ ... :) – EOL

+0

Хм, извините, я не видел «self.imageLabel» внутри первого self.addActions. Возможно, книга просто ошибается. (Что-то вроде QWidget.addAction (self.imageLabel, (editInvertAction, ...)), вероятно, будет работать, но это уродливо). Используйте self.imageLabel.addActions или, лучше, customContextMenuRequested сигнал. – iksaif

+0

Код книги, похоже, делает то, что предназначено. Спасибо за ваш полезный вклад! – EOL