【问题标题】:How to determine which widget emitted the signal如何确定哪个小部件发出了信号
【发布时间】:2019-06-05 09:03:28
【问题描述】:

我想让 QlineEdit 字段可双击,以便用户双击 QlineEdit 字段(例如,'qle01')调用一个函数。 该函数应该能够通过“名称”识别向函数发送信号的 QLineEdit 对象。

我不知道在下面的示例代码中“name”是否是描述“qle01”和“qle02”的正确词。也许更好的术语是“手柄”。

在下面的脚本中,如果双击 qle01,我的目标是在第 9 行打印“QLineEdit 字段的名称是 'qle01'。”我将不胜感激帮助弄清楚如何使第 9 行打印“QLineEdit 字段的名称是 'qle01'。”

在信用到期的地方给予信用,除了我在第 9 行的伪代码,下面的其余代码来自 StackOverflow 中的示例 1,mouseDoubleClickEvent with QLineEdit

import sys

from PyQt4 import QtGui

class LineEdit(QtGui.QLineEdit):
    def mouseDoubleClickEvent(self, event):
        print("pos: ", event.pos())
        # The next line is pseudo-code, because I don't know how to properly code it
        print("The QLineEdit field's name is '" + ['qle01' or 'qle02'] + "'") # i.e., depending on which of the 
                                                                       # QLineEdit fields was double-clicked  

class Widget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        qle01 = LineEdit()
        qle02 = LineEdit()
        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(qle01)
        lay.addWidget(qle02)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

关于如何将句柄或名称传递给插槽/函数,我有一些想法,但我没有得到任何有用的地方。

  1. 一个想法是让 QLineEdit 字段的信号发送到该字段的 QWidget.effectiveWinId(窗口系统标识符)的功能槽,但我不知道如何访问 QWidget.effectiveWinId。

  2. 另一个想法是使用我在许多帖子和教程中提到的 sender() 函数(例如How to determine who emitted the signal?)。我尝试使用 sender() 函数如下:

    class ObjectName(object):
    @QtCore.pyqtSlot()
    def __getattribute__(self, name):
        print "getting `{}`".format(str(name))
        print('str(self.sender()) = ' + str(self.sender()))      
    

但最后一行产生了这个输出:str(self.sender()) = None。

我在位于https://www.riverbankcomputing.com/static/Docs/PyQt4/ 的 PyQt4 参考指南下找不到对 sender() 函数的任何参考。所以我看不懂 sender() 函数,我显然不知道怎么用。

所以,最重要的是,我希望能帮助我弄清楚如何让第 9 行打印“QLineEdit 字段的名称是 'qle01'。”

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    变量名不标识对象,例如如下代码:

    qle01 = LineEdit()
    foo_name = qle01
    

    标识 QLineEdit 的变量的名称是什么?好吧 qle01 和 foo_name 因为它们都是内存空间的别名。

    可以做的是标识所有指向同一个对象的变量都具有相同id的对象。

    另一方面,如果在 QLineEdit 中进行了双击,最好实现一个信号来通知,因为这将允许我们通过 QObject 的 sender() 方法获取对象。

    import sys
    
    from PyQt4 import QtCore, QtGui
    
    
    class LineEdit(QtGui.QLineEdit):
        doubleClicked = QtCore.pyqtSignal()
    
        def mouseDoubleClickEvent(self, event):
            self.doubleClicked.emit()
            super(LineEdit, self).mouseDoubleClickEvent(event)
    
    
    class Widget(QtGui.QWidget):
        def __init__(self, *args, **kwargs):
            super(Widget, self).__init__(*args, **kwargs)
            self.qle01 = LineEdit(doubleClicked=self.on_doubleClicked)
            self.qle02 = LineEdit(doubleClicked=self.on_doubleClicked)
            lay = QtGui.QVBoxLayout(self)
            lay.addWidget(self.qle01)
            lay.addWidget(self.qle02)
    
        @QtCore.pyqtSlot()
        def on_doubleClicked(self):
            if self.sender() is self.qle01:
                print("The QLineEdit field's name is 'qle01'.")
            elif self.sender() is self.qle02:
                print("The QLineEdit field's name is 'qle02'.")
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2013-11-23
    • 1970-01-01
    • 2019-10-24
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多