2009-11-09 11 views
18

Gibt es ein Äquivalent von .NET Datenbindung in Qt?Qt entspricht der .NET-Datenbindung?

Ich möchte einige Kombinationsfelder und andere Widgets mit QStrings füllen, die sich auf bestimmte Entitäten in meiner Datenbank beziehen. Es wäre jedoch sauberer, wenn ich die Daten an diese Zeichenfolgen binden könnte, anstatt entweder die Datenbank erneut abzufragen, basierend auf einer neuen Combobox-Auswahl oder einem anderen Schema, das auf dem Erstellen meines eigenen Index von Entitäten basiert, die mit den QStrings gesucht würden.

Das Beste, was ich mir ausgedacht habe, ist, diese Entitäten von QString abzuleiten und sie auf diese Weise in die Widgets zu pushen, aber ich muss es noch versuchen. Ich bin mir nicht sicher, ob es so funktionieren wird, wie ich es möchte, und es scheint wie ein hässlicher Hack.

Wenn es keine Datenbindung gibt, was schlagen Sie vor?

Vielen Dank.

+8

+1 Aus irgendeinem Grund sollte die Idee, dass es einfach sein UI-Elemente an eine Datenbank oder ein Modell im Speicher zu binden, hat es nie weit außerhalb der Windows-Welt geschafft. Während es mit Qt-Signalen möglich ist, ist es immer noch eine Menge Code und sehr langweilig :( –

+0

Es ist eigentlich eine sehr alte Idee, die älter ist. Net. Ich habe es in den OOFILE Forms Frameworks im Jahr 1997 verwendet und ich habe gesehen Von AppMaker generierter Code eines noch früheren Jahrgangs, der Bindungen erzeugt, die sogar auf reinen C-Code zielen –

Antwort

3

Nun, speziell für Combobox können Sie ein Modell festlegen. Für QObjects im Allgemeinen können Sie das Benachrichtigungssignal für Eigenschaften verwenden, um eine Verbindung herzustellen oder andere nicht eigenschaftsbezogene Signale. Ich denke, es gibt einen anderen Weg, es zu tun, aber ich kann mich nicht erinnern.

+0

Dies scheint der Weg zu sein, danke, ich habe neu in Qt, und Ihr Vorschlag über die Modelle scheint der einfachste Weg dafür zu sein. Ich denke, das ist ein ziemlich hässlicher Ansatz für die Datenbindung, aber es scheint die Funktionalität zu liefern, die ich will. Nochmals vielen Dank. –

+3

Ich schlage vor, Sie betrachten QDataWidgetMapper, die für Widgets nicht unter dem MVC-Framework funktioniert. – cheez

5

Ein Weg verwendet Qt Model/View-Klassen (mit Basis bei QAbstractItemModel), aber sie müssen, dass Sie Widget QAbstractItemView erbt (das ist Widgets wie QTableView usw.).
Wenn Sie ein Qt-Modell auf eine Gruppe von Widgets abbilden möchten, die nichts mit QAbstractItemView gemein haben, können Sie QDataWidgetMapper verwenden, das ein separates Widget den Qt Model/View-Indizes zuordnet. Aber wie auch immer, wie Aaron Digulla sagte, müssen Sie einige Kesselplatte Code schreiben ...

6

Als Benutzer nonchalant erwähnt in einem Kommentar können Sie die QDataWidgetMapper Klasse verwenden. Dies ist eine ziemlich einfache Möglichkeit, beliebige Widgets an Daten zu binden, die in einem QAbstractItemModel gespeichert sind.

Das Beispiel auf der verlinkten Seite zeigt in wenigen Zeilen Code, wie Sie Ihr Datenmodell zu häufig verwendeten Eingabe-Widgets verknüpfen können:

QDataWidgetMapper *mapper = new QDataWidgetMapper; 
mapper->setModel(model); 
mapper->addMapping(mySpinBox, 0); 
mapper->addMapping(myLineEdit, 1); 
mapper->addMapping(myCountryChooser, 2); 
mapper->toFirst();