首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何确定哪个小部件发出了信号

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

Stack Overflow用户
提问于 2019-06-05 07:43:44
回答 1查看 2.1K关注 0票数 3

我想让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_())

关于如何将句柄或名称传递给插槽/函数,我有几个想法,但我没有得到任何有用的东西。

QWidget.effectiveWinId.

  • Another的一个想法是让发送者字段的信号发送到函数槽该字段的QWidget.effectiveWinId (窗口系统标识符),但是我不知道如何访问这个发送器的想法是使用我在许多帖子和教程中提到的()函数(例如How to determine who emitted the signal?)。我尝试使用sender()函数,如下所示:

类ObjectName(__getattribute__):@QtCore.pyqtSlot() def __getattribute__(self,{}):print "getting {}".format(str(name)) .format(‘str(self.sender())=’+str(self.sender()

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

我在位于https://www.riverbankcomputing.com/static/Docs/PyQt4/的PyQt4参考指南中找不到对sender()函数的任何引用。所以我不理解sender()函数,而且我显然不知道如何使用它。

所以,归根结底,我希望大家能帮我弄清楚如何让第9行打印出“QLineEdit字段的名字是‘qle01’”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 09:03:29

变量的名称不能标识对象,例如在下面的代码中:

qle01 = LineEdit()
foo_name = qle01

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

可以做的是识别对象,即指向同一对象的所有变量都将具有相同的id。

另一方面,最好实现一个信号来通知是否在QLineEdit中进行了doubleclick,因为这将允许我们通过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_())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56452618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档