私のビューとアプリケーションコントローラ間の通信にsignals
を使用します。私は次のアプローチを持っていますが、私はPyQt
の初心者ですから、それが正しいかどうかわかりません。誰かが私に正しい道にいるのか、もっと良い解決策があるのか教えてもらえますか?クラス間の通信に信号を使用する
EDIT:例を完全に動作する例に変更しました。
import sys
from PyQt4 import QtGui, QtCore
class View(QtGui.QMainWindow):
sigFooChanged = QtCore.pyqtSignal()
sigBarChanged = QtCore.pyqtSignal()
def __init__(self):
QtGui.QMainWindow.__init__(self)
central_widget = QtGui.QWidget()
central_layout = QtGui.QHBoxLayout()
self.__cbFoo = QtGui.QComboBox()
self.__cbBar = QtGui.QComboBox()
self.__cbFoo.currentIndexChanged[str].connect(lambda x: self.sigFooChanged.emit())
self.__cbBar.currentIndexChanged[str].connect(lambda x: self.sigBarChanged.emit())
central_layout.addWidget(QtGui.QLabel("Foo:"))
central_layout.addWidget(self.__cbFoo)
central_layout.addWidget(QtGui.QLabel("Bar:"))
central_layout.addWidget(self.__cbBar)
central_widget.setLayout(central_layout)
self.setCentralWidget(central_widget)
def setFooModel(self, model):
self.__cbFoo.setModel(model)
def setBarModel(self, model):
self.__cbBar.setModel(model)
class Controller:
def __init__(self, view):
self.__view = view
# Connect all signals from view with according handlers
self.__view.sigFooChanged.connect(self.handleFooChanged)
self.__view.sigBarChanged.connect(self.handleBarChanged)
self.__fooModel = QtGui.QStringListModel(["Foo1", "Foo2", "Foo3"])
self.__barModel = QtGui.QStringListModel(["Bar1", "Bar2", "Bar3"])
self.__view.setFooModel(self.__fooModel)
self.__view.setBarModel(self.__barModel)
def handleFooChanged(self):
print("Foo Changed")
def handleBarChanged(self):
print("Bar Changed")
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = View()
controller = Controller(view)
view.show()
sys.exit(app.exec_())
さて、このアプローチは、コードに多分もっと簡単ですが、私はGUIプログラミングの一つの目標は、 '' gui'andビジネスlogic'を分離することであるべきと思いましたか?これはどのようにして正常に行われますか? – Razer
あなたはgui依存関係から分離しておきたい非guiモジュールを持っていて、シグナルをそのメソッドに接続したい場合、その1つです。しかし、誰かがQtのジェネリックコントローラクラスにすべてのイベントとシグナルを転送しているところで、まだコードを見たことはありません。複雑なUIクラスをビュー(レイアウトとロジックなし)として使用している場合は、ロジックを分離しているので、コントローラとしてサブクラス化するQWidgetを検討してください。それまでの私はそれをどのように見てきたのですか?たくさんのコード例を見てください。 – jdi
私は、ビューをどこに、次にコントローラと見なすべきかを示すコード例を更新しました。私の見解は、レイアウトだけを定義し、ビジネスロジックを定義しない別々のUiモジュールです。それからあなたはそれから継承するクラスを持っていて、すべてのロジックを加えて、それをすべて結びつけます。 – jdi