【问题标题】:PyQt - Track Sender for contextMenuPyQt - 跟踪 contextMenu 的发件人
【发布时间】:2015-09-04 22:21:18
【问题描述】:

在 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()

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

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

    警告:此函数违反了面向对象的模块化原则。但是,当许多信号连接到单个插槽时,访问发送器可能会很有用。

    如果发送信号的所有小部件都来自同一类型,则可以使用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)
    

    【讨论】:

      【解决方案2】:

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

      例如:

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

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

      注意:obj=my_object 行不是多余的,详情请参阅here

      【讨论】:

      • 当我只想传递 obj 而不是 pos 时怎么办?当我这样做时,我仍然得到对象的位置
      • customContextMenuRequested 信号发出位置,对此您无能为力。因此,尽管您仍然必须将 pos 作为 lambda 函数的参数,但如果您不想将其传递给 clearCache(例如 my_object.customContextMenuRequested.connect(lambda pos, obj=my_object: self.clearCache(obj))
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-22
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多