PyQt5:根据文档出现一个信号而不是两个
PyQt5: one signal comes instead of two as per documentation
我一直在阅读 this PyQt5 documentation page 上的“按名称连接插槽”部分,它基本上描述了新的信号和插槽功能。这篇文章引起了我的注意:
For example the QtGui.QSpinBox class has the following signals:
void valueChanged(int i);
void valueChanged(const QString &text);
When the value of the spin box changes both of these signals will be emitted.
所以我草拟了以下脚本来测试这种双重调用行为:
#!/usr/bin/env python3
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QMainWindow, QSpinBox
class Test(QMainWindow):
def __init__(self):
super().__init__()
self.spb = QSpinBox()
self.spb.valueChanged.connect(self.onValueChanged)
self.setCentralWidget(self.spb)
def onValueChanged(self, x):
print("QSpinBox: value changed! " + str(x))
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
t = Test()
t.show()
sys.exit(app.exec_())
在我看来只有一个信号通过。我错过了什么?请注意,我是一个完整的PyQt
菜鸟。
您只连接到两个信号过载之一。
由于您也没有指定 您想要哪个 重载,默认值为 selected - 在本例中为 valueChanged(int)
。
要显式 select 两个 重载,您需要做:
self.spb.valueChanged[int].connect(self.onValueChanged)
self.spb.valueChanged[str].connect(self.onValueChanged)
...
def onValueChanged(self, x):
print("QSpinBox: value changed! ", x, type(x))
另请注意,文档是按名称讨论插槽的,因此您应该首先为旋转框添加一个名称。
self.spb.setObjectName("spb")
然后,连接所有插槽:
QtCore.QMetaObject.connectSlotsByName(self)
最后使用 on_widgetName_signalName
形式创建广告位。
def on_spb_valueChanged(self, x):
print("QSpinBox: value changed! " + str(x))
现在会调用两次。
使用 pyqtSlot
装饰器来指示您要接收的信号。
@QtCore.pyqtSlot(int)
def on_spb_valueChanged(self, x):
或者...
@QtCore.pyqtSlot(str)
def on_spb_valueChanged(self, x):
希望对您有所帮助。
我一直在阅读 this PyQt5 documentation page 上的“按名称连接插槽”部分,它基本上描述了新的信号和插槽功能。这篇文章引起了我的注意:
For example the QtGui.QSpinBox class has the following signals:
void valueChanged(int i); void valueChanged(const QString &text);
When the value of the spin box changes both of these signals will be emitted.
所以我草拟了以下脚本来测试这种双重调用行为:
#!/usr/bin/env python3
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QMainWindow, QSpinBox
class Test(QMainWindow):
def __init__(self):
super().__init__()
self.spb = QSpinBox()
self.spb.valueChanged.connect(self.onValueChanged)
self.setCentralWidget(self.spb)
def onValueChanged(self, x):
print("QSpinBox: value changed! " + str(x))
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
t = Test()
t.show()
sys.exit(app.exec_())
在我看来只有一个信号通过。我错过了什么?请注意,我是一个完整的PyQt
菜鸟。
您只连接到两个信号过载之一。
由于您也没有指定 您想要哪个 重载,默认值为 selected - 在本例中为 valueChanged(int)
。
要显式 select 两个 重载,您需要做:
self.spb.valueChanged[int].connect(self.onValueChanged)
self.spb.valueChanged[str].connect(self.onValueChanged)
...
def onValueChanged(self, x):
print("QSpinBox: value changed! ", x, type(x))
另请注意,文档是按名称讨论插槽的,因此您应该首先为旋转框添加一个名称。
self.spb.setObjectName("spb")
然后,连接所有插槽:
QtCore.QMetaObject.connectSlotsByName(self)
最后使用 on_widgetName_signalName
形式创建广告位。
def on_spb_valueChanged(self, x):
print("QSpinBox: value changed! " + str(x))
现在会调用两次。
使用 pyqtSlot
装饰器来指示您要接收的信号。
@QtCore.pyqtSlot(int)
def on_spb_valueChanged(self, x):
或者...
@QtCore.pyqtSlot(str)
def on_spb_valueChanged(self, x):
希望对您有所帮助。