我正在阅读一些关于PyQt5的文档,以设计一个简单的信号槽机制。由于设计考虑,我已经停滞不前。
请考虑以下代码:
为了追踪滑块所做的更改,我只需打印和记录所做的更改。我不喜欢代码的一点是我需要三次调用sld.valueChanged槽来将相同的信息发送到3个不同的槽中。
是否可以创建自己的pyqtSignal,将整数发送到单个槽函数中。反过来,槽函数发出需要进行的更改?
也许我没有完全理解emit()的目的,因为PyQt Signal-Slot docs中没有很好的例子说明其目的。我们只是给出了一个如何实现没有参数的emit的示例。
我想要做的是创建一个处理emit函数的函数。考虑以下内容:
这里显然存在一些严重的设计缺陷。我无法理解函数调用的顺序,而且我没有正确实现
请考虑以下代码:
import sys
from PyQt5.QtCore import (Qt, pyqtSignal)
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def printLabel(self, str):
print(str)
def logLabel(self, str):
'''log to a file'''
pass
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
#redundant connections
sld.valueChanged.connect(lcd.display)
sld.valueChanged.connect(self.printLabel)
sld.valueChanged.connect(self.logLabel)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Signal & slot')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
为了追踪滑块所做的更改,我只需打印和记录所做的更改。我不喜欢代码的一点是我需要三次调用sld.valueChanged槽来将相同的信息发送到3个不同的槽中。
是否可以创建自己的pyqtSignal,将整数发送到单个槽函数中。反过来,槽函数发出需要进行的更改?
也许我没有完全理解emit()的目的,因为PyQt Signal-Slot docs中没有很好的例子说明其目的。我们只是给出了一个如何实现没有参数的emit的示例。
我想要做的是创建一个处理emit函数的函数。考虑以下内容:
import sys
from PyQt5.QtCore import (Qt, pyqtSignal)
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
#create signal
self.val_Changed = pyqtSignal(int, name='valChanged')
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
sld.val_Changed.connect(self.handle_LCD)
self.val_Changed.emit()
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Signal & slot')
self.show()
def handle_LCD(self, text):
'''log'''
print(text)
'''connect val_Changed to lcd.display'''
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
这里显然存在一些严重的设计缺陷。我无法理解函数调用的顺序,而且我没有正确实现
pyqtSignal
。但是,我相信正确地说明以下3点将有助于我制作出适当的应用程序:
- 对于预定义的信号:将信号发送到槽函数。可以重新实现槽以使用信号值。
- 使用一些参数生成
pyqtSignal
对象。目前尚不清楚这些参数的目的以及它们与“发射”参数的区别。 emit
可以重新实现,以将特定的信号值发送到槽函数。还不清楚为什么需要发送与先前存在的信号方法不同的值。
@pyqtSlot(int)
不会影响输出。为什么会这样? - Maxmy_signal
是类的属性,而不是与任何QWidget相关联。对于创建类似于self.lcd.my_signal.connect(on_my_signal)
这样的东西,什么是良好的Qt风格? - Max