【发布时间】:2017-10-31 01:00:09
【问题描述】:
我正在使用 PyQt,我想在一个小部件上添加一个右键单击,但是我在网上找不到关于这个主题的任何代码。
你是怎么做到的?
【问题讨论】:
我正在使用 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,那么您的应用程序当然会中断。
还有其他方法可以做到这一点,这些是最知名的。
【讨论】:
我想出了一个非常简单的方法来做到这一点并且效果很好。在 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)
【讨论】: