在 Python 使用 PyQt5 库实现类似于 Flutter 的 BLoC (Business Logic Component) 模式可以帮助分离视图和业务逻辑,提高应用的可维护性。以下是如何在 PyQt5 应用中实现 BLoC 模式控制一个简单计数器的逻辑。
实现 BLoC
首先,创建一个 CounterBloc
类来封装计数器的业务逻辑。这个类将包括方法来增加和减少计数,以及使用信号来通知界面更新。
from PyQt5.QtCore import QObject, pyqtSignal
class CounterBloc(QObject):
count_changed = pyqtSignal(int) # 定义一个信号
def __init__(self):
super(CounterBloc, self).__init__()
self._count = 0
def increment(self):
self._count += 1
self.count_changed.emit(self._count) # 发送信号更新界面
def decrement(self):
self._count -= 1
self.count_changed.emit(self._count) # 发送信号更新界面
PyQt5 应用
在 PyQt5 应用中,创建一个简单的用户界面,其中包括显示计数、一个增加按钮和一个减少按钮。这些按钮将连接到 CounterBloc
类的方法。
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
class CounterApp(QWidget):
def __init__(self, bloc):
super(CounterApp, self).__init__()
self.bloc = bloc
self.init_ui()
def init_ui(self):
self.setWindowTitle("Counter BLoC Example")
layout = QVBoxLayout(self)
self.label = QLabel("0")
layout.addWidget(self.label)
btn_increment = QPushButton("Increment")
btn_increment.clicked.connect(self.bloc.increment)
layout.addWidget(btn_increment)
btn_decrement = QPushButton("Decrement")
btn_decrement.clicked.connect(self.bloc.decrement)
layout.addWidget(btn_decrement)
# 连接 BLoC 的信号到更新 UI 的槽
self.bloc.count_changed.connect(self.update_label)
def update_label(self, count):
self.label.setText(str(count))
if __name__ == '__main__':
app = QApplication([])
bloc = CounterBloc()
ex = CounterApp(bloc)
ex.show()
app.exec_()
在这个示例中,CounterBloc
作为模型处理所有业务逻辑,CounterApp
类负责创建和管理 UI。通过信号和槽机制,实现了视图与逻辑的清晰分离,使得代码结构更清晰,维护和扩展更为便捷。