MVC mal anders?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

so langsam rücke ich dem Thema "MVC" näher. Ich habe mir vor allem dieses Beispiel angeschaut. Hier wird in einem kleinen Beispiel gezeigt, dass man für MVC mindestens drei Module braucht, eins für den Controller, View und Model. Und gestern wollte ich für mich ein kleines Programm schreiben, den ich euch hier gleich vorstellen werde. Es ging mir darum, dass ich eine Kommunikation zwischen (erst einmal) zwei Fenster herstelle. Konkret: Ich habe eine Form in dem nur eine LineEdit ist, und eine zweite Form, in dem nur ein ListWidget ist. Gebe ich in Form 1 in der LineEdit was ein, betätige die Schaltfläche, soll diese Information in Form 2 in der ListWidget landen. Und da kam ich auf das Thema MVC. Der Grundgedanke ist ja schön, das man alles trennen möchte, aber auch irgendwie aufwändig. Man stelle sich nachher vor, für jede Angelegenheit eine MVC-Konstellation. Jedesmal mindestens drei Module, ehe das klappt was man will. Und da dachte ich, ob es eine Möglichkeit gäbe. Ich habe ja nun die Erfahrung mit QThread gemacht, und daran habe ich dann auch angesetzt. Hier nun mein ausführbares Progrämmchen:

ListWidget_Form.py

Code: Alles auswählen

import sys
from PyQt4.QtCore import Qt, pyqtSignal
from PyQt4.QtGui import QVBoxLayout, QPushButton, QDialog, QListWidget, QApplication, QWidget

from LineEdit_Form import LineEdit_Window 

class ListWidget_Window(QDialog):    
    def __init__( self, parent=None):
        QDialog.__init__( self, parent)

        self.layout = QVBoxLayout(self)
        
        # Create a widgets and add them to the main layout
        self.listWidget  = QListWidget()
        self.layout.addWidget(self.listWidget)
        self.pushButtonOpen = QPushButton("Open second form", self)
        self.layout.addWidget(self.pushButtonOpen)
        self.pushButtonCancel = QPushButton("Close", self)
        self.layout.addWidget(self.pushButtonCancel)
                
        self.lineEdit_window = LineEdit_Window()
        self.lineEdit_window.send.connect(self.on_receiver_slot)
        
        self.set_buttons()

    def create_second_form(self):
        self.lineEdit_window.show()

    def set_buttons(self):
        self.pushButtonOpen.clicked.connect(self.create_second_form)
        self.pushButtonCancel.clicked.connect(self.close)
    
    def on_receiver_slot(self, message):
        self.listWidget.addItem( message)

if __name__ == "__main__":
    app = QApplication( sys.argv)
    sender = ListWidget_Window()    
    sender.show()
    sys.exit(app.exec_())
LineEdit_Form.py

Code: Alles auswählen

from PyQt4 import QtCore
from PyQt4.QtGui import QVBoxLayout, QWidget, QLineEdit, QPushButton, QDialog

class LineEdit_Window(QDialog):
    send = QtCore.pyqtSignal(str)
    
    def __init__( self, parent=None):
        QDialog.__init__( self, parent)
        self.layout = QVBoxLayout(self)

        # Create a widgets and add them to the main layout
        self.lineEditExample = QLineEdit()
        self.layout.addWidget(self.lineEditExample)
        self.pushButtonUpdate = QPushButton("Update", self)
        self.layout.addWidget(self.pushButtonUpdate)
        self.pushButtonCancel = QPushButton("Close", self)
        self.layout.addWidget(self.pushButtonCancel)       

        self.set_action_button()

    def set_action_button(self):
        self.pushButtonUpdate.clicked.connect(self.emit_sender_slot)
        self.pushButtonCancel.clicked.connect(self.close)
    
    def emit_sender_slot(self):
        print 'Sender Slot triggered'
        self.send.emit( self.lineEditExample.text())
Das Beispiel klappt auch. Denn ich greife hier, ähnlich wie in QThread, auf PyQTSignal zurück. Jedoch habe ich eine Frage an euch. Seht ihr in meinem Beispiel irgendwelche Probleme? Alsp Probleme, die mich später an grenzen stoßen sollte? Ich fand mein Beispiel etwas angenehmer, denn hier brauche ich nicht, wie in MVC, erst einmal drei Module um die Daten rumzureichen. Jedoch möchte ich gerne wissen, ob mein Beispiel irgendwelche Grenzen hat?

Ich freue mich wie immer über Kritik.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

76 Zugriffe, und keiner mag sich dazu äußern? :-) Habe ich was falsch gemacht oder einen schlechten Eindruck in dieser Gemeinschaft (hach, ich habe bewusst auf "Community" verzichtet) hinterlassen?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich habe zuletzt vor Jahren etwas mit PyQt gemacht und das war deutlich einfacher gelagert. Was mir nur aufgefallen ist, ist, dass deine Ausführungen zu MVC seltsam sind. Schau dir das mal bei php an, da erschließt sich das Konzept m. E. leicht und es gibt viele, sehr einfache Anleitungen. IMHO musst du kein php können, um das Tutorial zu verstehen, da geht es eher ums Konzept.

Das ist m. E. auch informativ Wikipedia-Artikel zum Thema. Das ist nicht das, was du eingangs beschreibst bzw. woran du denkst...
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@ pixewakb: Eine kleine Nebenfrage: Wieso hast du dich von PyQT abgewendet? Aber zum eigentlich Anliegen. Ich habe mir schon einiges zum Thema MVC gelesen. Aber grundlegend lief es - zumindest bei einigen Python-Script-Beispiele - darauf hinaus, dass man immer in einem Dreieck arbeitet. Eine Vier, ein Model und ein Controller-Modul. Arbeiten über Umwege. Und in meinem Beispiel wollte ich einfach eine Kommunikation zwischen zwei Fenstern herstellen. Erst habe ich das mit MVC probiert, bin aber ziemlich oft gescheitert. Und da fiel mir dann das Prinzip von QThread wieder ein, dass man auch mit PyQtSignalen arbeiten kann. Aber da ich wenig erfahren bin, wollte ich Meinungen einholen. Inwieweit gibt es Grenzen? Wo liegen Probleme?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich habe seinerzeit mal was mit tkinter gearbeitet, was aber ohne WYSIWYG läuft. Ich brauche Skripte, die Datasets laden, durchgehen, auswerten und mir das Ergebnis zurückmelden. Ich brauche da nicht unbedingt ein GUI, weil ich die Ergebnisse der Messdaten will, nicht sehen möchte, was er gerade rechnet.

PyQt - ich bin mir ehrlich gesagt nicht sicher, ob es auf lange Sicht noch reine Desktop-Applikationen geben wird, die Tendenz geht - m. E. Richtung Browser, ergo wäre m. E. Flask, Bottle, Django o. ä. interessanter.

Zur zweiten Frage: Ich habe zuwenig Ahnung von PyQt, um das sinnvoll beantworten zu können. Ich erinnere mich, dass ich seinerzeit ein Hauptfenster hatte und die Daten von da abgingen und nach dort zurückkamen, da brauchte ich keinen Umweg.

Mein persönlicher Eindruck: Du machst irgendeinen Gedankenfehler, was MVC angeht. Im Kern hast du eine Datenbasis (M) und eine Steuereinheit, die je nach Bedarf eine Datenpräsentation ausgibt.

Stell dir ein php-Projekt vor. Du hast eine Datenbank aus der mein php-Skript (C) die Daten je nach Benutzerwunsch herausnimmt und dann je nach Situation eine geeignete HTML-Seite (Formular) mit den Daten darinnen (befülltes Formular) ausgibt. Ob die HTML-Seite 1 oder die HTML-Seite 2 ausgegeben wird, entscheidet der Controller nach Benutzeranfrage.

So verstehe ich MVC ohne da tief im Thema zu stecken. Wenn ich dich richtig verstehe, dann baust du da zu viel Overhead rein, der nicht sinnvoll ist. Google mal nach MVC-Anleitungen zu php... Die sind teils einfach erklärt und einfach gehalten.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

http://tutorials.lemme.at/mvc-mit-php/#mvcumsetzen

Guck dir das mal an. Der Quellcode ist sehr überschaubar und es sollte klar sein, was da passiert. Wie man das in PyQT umsetzt, kann ich dir nicht sagen, aber (ich vermute) es sollte vergleichbar einfach gehen...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pixewakb hat geschrieben:Schau dir das mal bei php an, da erschließt sich das Konzept m. E. leicht und es gibt viele, sehr einfache Anleitungen.
Inwiefern ist denn PHP prädestiniert für MVC? Dies erschließt sich mir überhaupt nicht!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

@Hyperion, du könntest auch die Frage des Thread-Starters beantworten. Dafür fehlt mir das Fachwissen.

Die php-Beispiele zu MVC finde ich leichter verständlich und eingängiger, als das mit Python umsetzbar wäre. Das ist meine persönliche Meinung.
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: wie kann etwas in PHP umgesetztes leichter verständlich sein als das selbe in Python? :twisted:
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Nun, ich habe ein recht leicht verständliches MVC-Beispiel gefunden:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore, uic
import sys

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    app.setStyle("cleanlooks")
    
    #DATA
    data = QtCore.QStringList()
    data << "one" << "two" << "three" << "four" << "five"

    listView = QtGui.QListView()    
    listView.show()

    model = QtGui.QStringListModel(data)
    
    listView.setModel(model)
    
    
    combobox = QtGui.QComboBox()
    combobox.setModel(model)
    combobox.show()
    
    listView2 = QtGui.QListView()
    listView2.show()
    listView2.setModel(model)
    

    sys.exit(app.exec_())
ABER, dieses Beispiel ist nur solange "leicht" verständlich, solange alles in einem Modul bleibt. Würde ich für jedes Fenster, also für Listview, für Combobox und für Listview2 jeweils ein Modul anlegen und somit jeweils ein Fenster kreieren, dann sähe das MVC-Beispiel schon wieder kompliziert aus. Aber soweit ich mich eingelesen habe, ist MVC nur ein Konzept von vielen und somit nicht DAS Konzept schlecht hin, hmhm? Aber ich weiß immer noch nicht, wo meine Version gegen MVC ihre Grenzen hat?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Löse Dich mal von der Vorstellung, dass etwas komplizierter wird, wenn man mehrere Module hat, bzw. dass man Dinge anders löst, wenn man nur *ein* Modul hat. Module dienen primär dazu, *thematisch zusammengehörige* Dinge zu organisieren.

Dies nur vorweg.

Dein erstes Beispiel ist imho kein besonders gelungenes für MVC! Da fehlt doch das Modell ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Hyperion: Ich wollte in meinem ersten Beispiel auch kein MVC kreieren, sondern MVC ausweichen. Die Kommunikation zwischen zwei Fenstern sind ja schon einmal vorhanden. Ich denke, ein MVC ist erst dann gut, wenn man will, dass ein Ereignis auf mehr als zwei Fenster gleichzeitig zusehen sein soll, wie eben das zweite Beispiel.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich klinke mich mal aus der Diskussion aus, weil ich zuwenig von PyQt und zuwenig von MVC verstehe, aber das, was du schreibst, hat m. E. nichts mit MVC zu tun, das ist unabhängig von ein oder mehr Fenstern!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:

Ein paar grundsätzliche Sachen zu MVC - die Sache ist im Softwaredesign angesiedelt, heisst man macht sich grundlegende Gedanken zum Aufbau des Programmes (Architekturmuster, bei MVC vorallem des Datenmodells und -flusses) bzw. eines Teilproblems (wäre dann eher ein Entwurfsmuster). Das hat alles noch nichts mit Code oder Implementierung zu tun, die Überlegungen passieren 2 oder 3 Ebenen darüber. Du bist hier mitten in der Softwareentwicklung gelandet, welche durch die Entwicklung von Entwurfmustern Probleme der frühen Jahre versucht zu behandeln (z.B. Wiederverwendbarkeit von Komponenten, Trennung der Zuständigkeiten, interne Standardisierung usw.)

MVC ist eines der Architekturmuster, welches eine weite Verbreitung gefunden hat. Man findet es vielen SDKs und Programmierer kennen es in der Regel. Qt geht auch diesen Weg und hat in sein SDK ebenfalls MVC verbacken. Allerdings ist nicht MVC gleich MVC. Das wird zum Teil sehr verschieden umgesetzt. Z.B. ist ein wiederkehrender Streitpunkt die Rolle des Controllers - so packen manche alle Geschäftslogik in den Controller, was eher der reinen Lehre entspricht, andere packen auch Logik ins Model oder in den View. An dieser Stelle wird es müßig zu hinterfragen, warum SDK-A das so löst und SDK-B wieder anders - das sind in der Regel Designentscheidungen der SDK-Maintainer, welche versuchen, Sprach- und SDK-eigenheiten unter einen Hut zu bringen. Auch bei Qt wirst du feststellen, dass es nicht das "reine" MVC ist.

An dieser Stelle hilft dann ein MVC-Ansatz in PHP wenig weiter - am Ende des Tages musst Du mit der MVC-Lösung in Qt klar kommen. Die klassische 3-Teilung ist in Qt z.B. eher ein MVc (c kleingeschrieben ;) ), hier sind die Modelklassen sehr mächtig und den Controller muss man mit der Lupe suchen. So werden z.B. die Delegates für Datenänderungen als Abstraktion zwischen View und Model realisiert.

Ich hab mir Deinen Code noch nicht genauer angeschaut, dazu später evtl. mehr.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Es ist mir immer wieder ein Vergnügen deine Ausführungen zu lesen - und das meine ich ohne jegliche rhetorische Figur (also ohne Sarkasmus, Ironie oder Zynismus). Wenn du dir mal meinen ersten Beispiel angesehen hast, kannst du dich gern daran austoben. Im zweiten Beispiel, in welcher ListView, Combobox und ListView2 miteinander in einer Verbindung stehen, kannst du dir auch gern mal ansehen. Meinen zweiten Beispiel verstehe ich auch, aber nur solange dies in einem Modul ist. Würde ich das alles auseinander klamüsern, zum Beispiel LisView, Combox und ListView jeweisl ein eigenes Modul (View), dann hätte ich erst einmal drei separate Views. Dann bräuchte ich noch ein Controller und ein Model. Im Model würde ich die Programmlogik packen. Aber ich scheitere immer noch bei der Umsetzung. Ich versuche mal ein weiteres Beispiel zu kreieren. Dazu später.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sophus hat geschrieben:Meinen zweiten Beispiel verstehe ich auch, aber nur solange dies in einem Modul ist. Würde ich das alles auseinander klamüsern, zum Beispiel LisView, Combox und ListView jeweisl ein eigenes Modul (View), dann hätte ich erst einmal drei separate Views. Dann bräuchte ich noch ein Controller und ein Model. Im Model würde ich die Programmlogik packen.
Du hast doch auch so schon *drei* Views! Die UI-Elemente fungieren als View egal, *wo* sie im Code stehen. Das hatte ich Dir oben doch schon gesagt - vergiss mal für einen Augenblick Module und Code-Aufteilung! Ein View bleibt ein View - egal, wo er im Code steht!

Ein ``QListView`` ist doch auch ein View - und der "steht" ja auch in einem anderen als Deinem eigenen Modul in Beispiel 2!

Die Intention von MVC ist letztlich das Erreichen einer losen Kopplung von Komponenten. Dies leitet sich unmittelbar von den grundlegenden OOP Prinzipien ab, wie z.B. dem "Single Responsability Principle" aus SOLID. (Ich denke mal, damit habe ich Dich bereits öfter konfrontiert) Das alles hat letztlich den Sinn, Software besser entwickeln zu können. Testbarkeit, Parallelisierbarkeit der Entwicklung, leichtere Wartung, Wechsel / Austausch von Komponenten (Open Closed Principle), uvm.

Ob man das selber alles so machen will, bleibt einem selber überlassen. IdR. ist es eine gute Idee, *etablierte* Pattern zu übernehmen - das gilt ja allgemein im Leben ;-)

Wie ich schon sagte ist Dein erstes Beispiel gar kein MVC; es fehlt dort schlicht am gemeinsamen Modell. Dein zweites Beispiel zeigt es schon besser: Du hast *ein* Datenmodell, welches in verschiedenen UI-Komponenten dargestellt wird.

Ich würde Dir raten, mal ein simples "Standardmodell" zu nehmen, wie ein Adressbuch, TODO-Liste usw. Diese kannst Du UI-technisch als Liste darstellen, in der lediglich eine *kurze* Information zur Identifikation enthalten ist, wie etwa Vor- und Nachname. Daneben kannst Du dann eine UI-Komponente bestehend aus Labeln und verschiedenen Eingabefeldern basteln, die *alle* Details eines Datensatzes anzeigt. Wählt man in der Liste einen anderen Datensatz, so ändern sich die Details. Editiert man ein Detail (und übernimmt dieses), so ändert sich sofort die Darstellung in der Liste. Schaffe Dir ein Modell, welches die Datensätze nach außen, also für die UI-Komponenten kapselt. Dann integriere dieses Modell in die *beiden* verschiedenen UI-Komponenten. Danach stelle von fixen Demo-Datensätzen auf serialisierte um, die Du aus einer JSON-Datein einliest. Dann stelle das ganze auf eine kleine SQLite-DB um und füge ein ``QtSqlModell`` (sollte so ähnlich heißen!) anstelle des bisherigen ein. Dann baue die Möglichkeit zu filtern und zu sortieren ein (Decorator-Pattern durch Proxy-Klassen). Dabei wirst Du ein Gespühr bekommen, wieso es sinnvoll ist, die Darstellung und Kommunikation bei Aktionen über ein zentrales Modell laufen zu lassen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Hyperion: Deine aufgegebenen Hausaufgaben werde später vielleicht einmal befolgen :-)

Aber damit es etwas konkreter wird habe ich mir mal ein kleines Beispiel zusammen gebastelt:

bmi.py Hauptprogramm - (View1)

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication, QVBoxLayout, QPushButton, QLineEdit, QDialog, QCompleter, QStringListModel
from func_bmi import calculate_bmi

# load form_one and form_two
from form_one import ResultOne
from form_two import ResultTwo

class BMICalculator(QDialog):

    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        
        self.layout = QVBoxLayout(self)

        # Create a widgets and add them to the main layout
        self.lineEdit_height = QLineEdit()
        self.layout.addWidget(self.lineEdit_height)
        self.lineEdit_weight = QLineEdit()
        self.layout.addWidget(self.lineEdit_weight)
        
        self.calculate_button = QPushButton("Calculate", self)
        self.layout.addWidget(self.calculate_button)
        self.close_button = QPushButton("Close", self)
        self.layout.addWidget(self.close_button)

        self.set_action_button()
        self.create_form_one()
        self.create_form_two()

    def set_action_button(self):
        self.calculate_button.clicked.connect(self.on_calculate)
        self.close_button.clicked.connect(self.on_finished)

    def on_finished(self):
        self.close()

    def closeEvent(self, event):
        print "Windows closes"

    def on_calculate(self):
        size = self.lineEdit_height.text()
        weight = self.lineEdit_weight.text()
        try:
            result = str(calculate_bmi(int(size), int(weight)))
        except ZeroDivisionError:
            result = ''
        self.on_model(result)
        
    def on_model(self, data):
        model = QStringListModel(data)
        self.window_one.lineEdit_result_one.setModel(model)
        self.window_two.lineEdit_result_two.setModel(model)
        
    def create_form_one(self):
        self.window_one = ResultOne()
        self.window_one.show()

    def create_form_two(self):
        self.window_two = ResultTwo()
        self.window_two.show()       
 
def main():
    application = QApplication(sys.argv)
    bmi_calculator = BMICalculator()
    bmi_calculator.show()
    sys.exit(application.exec_())
 
 
if __name__ == '__main__':
    main()
form_one.py (View2)

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4.QtGui import QVBoxLayout, QLineEdit, QDialog

class ResultOne(QDialog):

    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        
        self.layout = QVBoxLayout(self)

        # Create a widgets and add them to the main layout
        self.lineEdit_result_one = QLineEdit()
        self.layout.addWidget(self.lineEdit_result_one)
form_two.py (View3)

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4.QtGui import QVBoxLayout, QLineEdit, QDialog

class ResultTwo(QDialog):

    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        
        self.layout = QVBoxLayout(self)

        # Create a widgets and add them to the main layout
        self.lineEdit_result_two = QLineEdit()
        self.layout.addWidget(self.lineEdit_result_two)
func_bmi.py Programmlogik- (Model)

Code: Alles auswählen

from __future__ import division
from decimal import Decimal

def calculate_bmi(height, weight):
    return (weight / height**2)
Was sehen wir hier? Ich habe hier insgesamt drei Views, ein Hauptfenster, in denen die Größe und das Gewicht eingegeben wird, und dann habe ich zwei weitere Fenster, in denen die Ergebnis gleichermaßen angezeigt werden. Über Sinn und Unsinn wollen wir mal nicht diskutieren. Als nächstes habe ich dann die Programmlogik, in der der BMI-Wert ausgerechtet und anschließend das Ergebnis zurückgegeben werden soll. Hier möchte ich lernen, wie ich die Ergebnisse über das MVC-Konzept verteilen kann. Die beiden anderen Fenster enthalten nur eine QLineEdit, in denen die Ergebnisse angezeigt werden soll.

WICHTIG: Mein Beispiel funktioniert insofern nicht, weil QLineEdit keine setModel()-Methode besitzt.

Aber was ich hier deutlich machen wollte, ist, dass ich nicht weiß, wohin mit dem Controller? Oder übersehe ich hier was? Ist meine Grundidee hier erst einmal richtig bzw. geht meine Idee in die richtige Richtung?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ist es auch möglich ein MVC zu kreieren und das unabhängig vom QT? Denn ein QStringListModel zum Beispiel ist ja ein QT-Rahmenwerk, richtig? Und ich möchte mich weitestgehend von QT kapseln. Denn auch das Arbeiten mit MySQL-Datenbank bewerkstellige ich auch ohne QT, denn es gibt ja auch dieses QSql soweit ich weiß. Da arbeite ich lieber mit der Bibliothek MySQLdb. Mir geht es am Ende darum, dass ich - angenommen ich entscheide mich später für tkinter - die GUI austauschen kann, ohne dass ich dann das MVC-Konzept neu bearbeiten muss, weil hier dann QT weg fällt. Ist das möglich? Und wenn ja, hat jemand ein kleines Beispiel wie das aussehen würde?

Gruß
Sophus
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: Qt liefert halt schon viel von V und C mit. Wenn man sich von Qt unabhängig machen will, muß man diesen Teil selbst implementieren und eine Abstraktionsschicht einziehen, die dann wieder für Qt oder ein anderes Rahmenwerk konkretiesiert werden muß.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Gibt es dazu irgendwo Beispiele? Denn ich habe absolut keine Vorstellung von dem. Also wie man ein MVC-Konzept ohne Qt bewerkstelligen kann. Mir gehtes da viel mehr um das Model, denn beim. View (soweit ich esrichtig verstehe) werden die ui-Dateien dynamisch geladen.
Antworten