我正在使用PyQt,并且想要在小部件上添加右键单击事件,但是我在网上找不到任何相关代码。
你应该怎么做?
你应该怎么做?
你只需要覆盖处理它的方法。
在这种情况下,你将覆盖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
就会导致您的应用程序崩溃。
还有其他方法可以做到这一点,但这些是最常见的方法。
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)