PyQt - 给小部件添加右键单击功能

9
我正在使用PyQt,并且想要在小部件上添加右键单击事件,但是我在网上找不到任何相关代码。
你应该怎么做?

2个回答

14

你只需要覆盖处理它的方法。

在这种情况下,你将覆盖mousePressEvent方法,看看它是否对你所需的内容有意义并起作用。

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget


class MyWidget(QWidget):


    def __init__(self):
        super(MyWidget, self).__init__()

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.LeftButton:
            print("Left Button Clicked")
        elif QMouseEvent.button() == Qt.RightButton:
            #do what you want here
            print("Right Button Clicked")

if __name__ == "__main__":

    app = QApplication(sys.argv)
    mw = MyWidget()
    mw.show()
    sys.exit(app.exec_())

另一个很好的方法是在您的对象中安装事件过滤器并重写其事件过滤器。在该方法内,您可以实现所需操作。请记住,您始终可以使用 pyqtSignal 进行良好的编程实践,并调用另一个对象来完成工作,而不是将大量逻辑负载到方法中。

以下是另一个小例子:

import sys

from PyQt5.QtCore import QEvent
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget

class MyWidget(QWidget):

    def __init__(self):
        super(MyWidget, self).__init__()
        self.installEventFilter(self)

    def eventFilter(self, QObject, event):
        if event.type() == QEvent.MouseButtonPress:
            if event.button() == Qt.RightButton:
                print("Right button clicked")
        return False

if __name__ == "__main__":

    app = QApplication(sys.argv)
    mw = MyWidget()
    mw.show()
    sys.exit(app.exec_())

注意:请记住,此示例将接收所有类型的事件,因此您必须小心并确保它是您想要的事件,而不是运行时破坏您的应用程序调用不存在的事件方法,因为它不是那种类型的事件。例如,如果在确认之前调用 event.button(),而没有确定它是一个 QEvent.MouseButtonPress 就会导致您的应用程序崩溃。

还有其他方法可以做到这一点,但这些是最常见的方法。


-2
我想到了一种非常简单的方法,而且完美地运作。在ControlMainWindow类中添加以下内容来初始化上下文菜单策略为CustomeContextMenu,其中listWidget_extractedmeters将是您的QListWidget的名称:
    self.listWidget_extractedmeters.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.listWidget_extractedmeters.connect(self.listWidget_extractedmeters,QtCore.SIGNAL("customContextMenuRequested(QPoint)" ), self.listItemRightClicked)

然后在ControlMainwindow类中,以下函数允许您添加上下文菜单项并调用执行某些功能的函数:

def listItemRightClicked(self, QPos): 
    self.listMenu= QtGui.QMenu()
    menu_item = self.listMenu.addAction("Remove Item")
    self.connect(menu_item, QtCore.SIGNAL("triggered()"), self.menuItemClicked) 
    parentPosition = self.listWidget_extractedmeters.mapToGlobal(QtCore.QPoint(0, 0))        
    self.listMenu.move(parentPosition + QPos)
    self.listMenu.show() 

def menuItemClicked(self):
    currentItemName=str(self.listWidget_extractedmeters.currentItem().text() )
    print(currentItemName)

如何在PyQT5中实现? - Imran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接