Je souhaite utiliser signals
pour communiquer entre ma vue et mon contrôleur d'application. J'ai l'approche suivante mais puisque je suis débutant dans PyQt
je ne sais pas si c'est la bonne. Quelqu'un peut-il me dire si je suis sur la bonne voie ou y at-il de meilleures solutions?Utilisation de Signaux pour la communication entre classes
EDIT: J'ai changé l'exemple pour un exemple complet.
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_())
Eh bien, cette approche est peut-être plus facile à coder mais je pensais un but de la programmation devrait être de IUG séparer '' gui'and logic' d'affaires? Comment cela se fait-il normalement? – Razer
Sa seule chose si vous avez un module non-gui que vous voulez garder séparé de la dépendance gui, et connectez les signaux à ses méthodes. Mais je n'ai encore jamais vu de code où quelqu'un transmet tous les événements et signaux à une classe de contrôleur générique dans Qt. Vous séparez toujours la logique lorsque vous avez une classe d'interface utilisateur stricte en tant que vue (juste mise en page et aucune logique), puis considérez le QWidget qui le sous-classe comme contrôleur. C'est comme ça que j'ai vu ça à ce jour. Regardez des tonnes d'exemples de code. – jdi
Je viens de mettre à jour mon exemple de code pour montrer où je considère la vue, puis contrôleur. La vue, pour moi, est le module Ui séparé définissant seulement une mise en page et aucune logique métier. Ensuite, vous avez une classe qui en hérite et ajoute dans toute la logique, l'attachant tous ensemble. – jdi