我正在阅读关于PyQt5的一些文档,以获得一个简单的信号槽机制。出于设计上的考虑,我已经停了下来。

请考虑以下代码: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,将整数发送到单个槽函数。然后让slot函数发出需要进行的更改?也许我不完全理解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。不过,我相信正确地陈述以下三点将有助于我制作出一款合适的应用程序:对于预定义信号:将信号发送到插槽功能。插槽可以重新实现以使用信号值。

使用一些参数生成pyqtSignal对象。目前尚不清楚这些参数的用途以及它们与“emit”参数的区别。

emit可以重新实现以向slot函数发送特定的信号值。现在还不清楚为什么我需要发送不同于以前现有信号方法的值。

请随意完全改变我正在尝试做的代码,因为我还没有弄清楚它是否在良好的风格领域。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐