如何确定哪个小部件发出信号

时间:2019-06-04 23:43:44

标签: python pyqt pyqt4

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

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

在下面的脚本中,如果双击qle01,我的目标是打印第9行,“ QLineEdit字段的名称为'qle01'。”我希望能帮助您弄清楚如何使第9行打印为“ QLineEdit字段的名称为'qle01'。”

应归功于应得的功劳,除了我在第9行的伪代码外,下面的其余代码摘自mouseDoubleClickEvent with QLineEdit上StackOverflow帖子中的示例1。

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. 另一个想法是使用我在许多帖子和教程(例如How to determine who emitted the signal?)中提到的sender()函数。我尝试如下使用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'。”

1 个答案:

答案 0 :(得分: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_())