Qt:为中央小部件添加上下文菜单的最佳方法?

1 投票
1 回答
1489 浏览
提问于 2025-04-16 03:22

我不明白为什么在书籍《用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)。

撰写回答