如何使用PyQt5在Python文本框中添加默认上下文菜单?

时间:2017-06-21 03:35:25

标签: python python-3.x pyqt5

我正在尝试向文本框中添加功能,用户可以在其中突出显示单词,右键单击并能够选择是否为突出显示的单词定义或获取同义词。我编写了一个上下文菜单,但它仅在我单击文本框外部时才会显示。无论如何我可以添加功能到默认上下文菜单,包括复制,粘贴等?这是我的上下文菜单的代码。

self.setContextMenuPolicy(Qt.ActionsContextMenu)
defineAction = QtWidgets.QAction("Define", self)
defineAction.triggered.connect(lambda: self.define(event))
self.addAction(defineAction)
synonymAction = QtWidgets.QAction("Find Synonyms", self)
synonymAction.triggered.connect(lambda: self.synonym(event))
self.addAction(synonymAction)

1 个答案:

答案 0 :(得分:1)

您需要对文本编辑小部件进行子类化并覆盖createStandardContextMenu(point)

在重写的方法中,调用基本调用实现以获取标准上下文菜单对象(它返回QMenu)。使用自定义操作修改此菜单,然后返回菜单。

当用户请求上下文菜单时,将调用该函数。

有关详细信息,请参阅http://doc.qt.io/qt-5/qplaintextedit.html#createStandardContextMenu

编辑:您可以像这样继承

class MyTextEdit(QLineEdit):
    def createStandardContextMenu(self, menu):
          #as above, reimplement this method

然后在创建GUI时使用该类而不是QLineEdit

或者我记得有一个名为customContextMenuRequested的信号。你可以像这样使用它

#assume you have the textbox in a variable called self.my_textbox
self.my_textbox.setContextMenuPolicy(Qt.CustomContextMenu)
self.my_textbox.customContextMenuRequested.connect(self.generate_context_menu)

然后将类添加到生成GUI的类中:

def generate_context_menu(self, location):
    menu = self.my_textbox.createStandardContextMenu()
    # add extra items to the menu

    # show the menu
    menu.popup(self.mapToGlobal(location))