如何确定哪个小部件发出了信号
How to determine which widget emitted the signal
我想让 QlineEdit 字段可以双击,这样用户双击 QlineEdit 字段(例如,'qle01')就会调用一个函数。
该函数应该能够通过 'name' 向函数发送信号的 QLineEdit 对象来识别。
我不知道下面示例代码中 'name' 是否适合描述 'qle01' 和 'qle02'。也许更好的术语是 'handle'.
在我下面的脚本中,如果双击 qle01,我的目标是打印第 9 行,"The QLineEdit field's name is 'qle01'."如果能帮助我弄清楚如何打印第 9 行,我将不胜感激"The QLineEdit field's name is 'qle01'."
在信用到期的地方给予信用,除了我在第 9 行的伪代码,下面的其余代码来自
上的 Whosebug 帖子中的示例 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_())
关于如何获取传递给 slot/function 的句柄或名称,我有一些想法,但我没有得到任何有用的东西。
一个想法是让 QLineEdit 字段的信号发送到字段的 QWidget.effectiveWinId(window 系统标识符)的功能槽,但我不知道如何访问 QWidget.effectiveWinId.
另一个想法是使用我在许多帖子和教程中提到的 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 行,我将不胜感激 "The QLineEdit field's name is 'qle01'."
变量名不标识对象,例如以下代码:
qle01 = LineEdit()
foo_name = qle01
标识QLineEdit 的变量名称是什么?好吧 qle01 和 foo_name 因为它们都是内存 space.
的别名
可以做的是识别对象,所有指向同一个对象的变量都将具有相同的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_())
我想让 QlineEdit 字段可以双击,这样用户双击 QlineEdit 字段(例如,'qle01')就会调用一个函数。 该函数应该能够通过 'name' 向函数发送信号的 QLineEdit 对象来识别。
我不知道下面示例代码中 'name' 是否适合描述 'qle01' 和 'qle02'。也许更好的术语是 'handle'.
在我下面的脚本中,如果双击 qle01,我的目标是打印第 9 行,"The QLineEdit field's name is 'qle01'."如果能帮助我弄清楚如何打印第 9 行,我将不胜感激"The QLineEdit field's name is 'qle01'."
在信用到期的地方给予信用,除了我在第 9 行的伪代码,下面的其余代码来自
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_())
关于如何获取传递给 slot/function 的句柄或名称,我有一些想法,但我没有得到任何有用的东西。
一个想法是让 QLineEdit 字段的信号发送到字段的 QWidget.effectiveWinId(window 系统标识符)的功能槽,但我不知道如何访问 QWidget.effectiveWinId.
另一个想法是使用我在许多帖子和教程中提到的 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 行,我将不胜感激 "The QLineEdit field's name is 'qle01'."
变量名不标识对象,例如以下代码:
qle01 = LineEdit()
foo_name = qle01
标识QLineEdit 的变量名称是什么?好吧 qle01 和 foo_name 因为它们都是内存 space.
的别名可以做的是识别对象,所有指向同一个对象的变量都将具有相同的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_())