Qt:为中央小部件添加上下文菜单的最佳方法?
我不明白为什么在书籍《用Python和Qt快速编程图形界面》中,要通过在主窗口上调用 addActions()
来给中央小部件添加上下文菜单,就像这样(第180页):
self.addActions(self.imageLabel,
(editInvertAction, …))
这里的 self
是一个 QMainWindow
,而 imageLabel
是一个 QLabel
,它被设置为中央小部件,代码如下:
# Added actions will be put in a context menu:
self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu)
self.setCentralWidget(self.imageLabel)
那么,为什么主窗口要通过 self.addActions()
和中央小部件的上下文菜单关联起来呢?直接在中央小部件上调用 addActions()
不就可以了吗?实际上,下面的代码确实可以创建一个上下文菜单:
self.imageLabel.addActions((editInvertAction, …))
为什么书中的例子不这样做呢?这难道不是和更复杂的 self.addActions(…)
形式等效吗?
附注:我甚至看到 QMainWindow.addActions() 的文档中根本没有提到任何第一个参数(上面的 self.imageLabel
)!我完全搞不懂为什么书中使用了上面的代码片段,而不是最后一个… 求助! :)
1 个回答
1
在QMainWindow上使用self.addAction()可以让所有QMainWindow的子组件(比如停靠窗口、状态栏、工具栏、菜单栏等等)都能使用这些动作,而不仅仅是中心小部件。
不过,想要更细致地控制右键菜单,最好的办法是使用customContextMenuRequested信号(http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#customContextMenuRequested)。