PyQt - 右键单击​​一个小部件

时间:2017-05-30 13:50:14

标签: python pyqt pyqt5

我正在使用PyQt,我想在窗口小部件中添加右键,但我在网上找不到关于此主题的任何代码。

你怎么能这样做?

2 个答案:

答案 0 :(得分:2)

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

在这种情况下,您将覆盖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_())

另一个好方法是在对象中安装事件过滤器并覆盖其eventFilter。在这种方法中你可以做出你想要的东西。请记住,您总是可以使用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您的应用就会中断。

还有其他方法,这些是最知名的。

答案 1 :(得分:-2)

我想出了一个非常简单的方法来完成这项工作并且完美无缺。在ControlMainWindow类中添加以下内容以将Context菜单策略初始化为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)