PyQt - 跟踪上下文菜单的发件人

PyQt - Track Sender for contextMenu

鼠标右键单击 QLabel() 获取 Sender 的方法是什么?我想知道鼠标右键单击发生在哪个 Widget 上。我有获取位置的代码,但如何获取发件人?

获取发件人我可以检索 accessibleName()

这是我目前的最小代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-



import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import *    #!/usr/bin/python
# -*- coding: utf-8 -*-



import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Example(QtGui.QWidget):

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

        self.initUI()

    def initUI(self):               

        # qbtn = QtGui.QPushButton('Quit', self)
        label =  QLabel("BG Sessions", self)
        label.setContextMenuPolicy(Qt.CustomContextMenu)
        label.setObjectName("title")
        label.customContextMenuRequested.connect(self.clearCache)
        label.move(50, 50)       

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()

    def clearCache(self, pos):
        print pos


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

self.sender() 插槽内完成这项工作。

如果您想按照 Alexander Lutsenko 的建议使用 sender(),请记住这一点: QT-documentation

Warning: This function violates the object-oriented principle of modularity. However, getting access to the sender might be useful when many signals are connected to a single slot.

如果发送信号的所有小部件都来自同一类型,则可以使用findChild()。这正在使用我的 tableViews:

# create signalMapper
self.signalMapper = QtCore.QSignalMapper(self)
self.signalMapper.mapped[str].connect(<slot>)

# connect the widgets with signalMapper
self.<widget>.<yourSignal>.connect(self.signalMapper.map)
self.signalMapper.setMapping(self.<widget>, self.<widget>.objectName())         # sends objectName() to slot

# in slot:
obj = self.findChild(QtWidgets.QLabel,objectname)

您可以更改连接信号的方式,以便传递对连接信号的对象的引用。

例如:

my_object.customContextMenuRequested.connect(lambda pos, obj=my_object: self.clearCache(pos, obj))

(您当然需要修改 clearCache() 以便它接受这个额外的参数)

注意:obj=my_object 行不是多余的,详见 here