Saturday, 29 July 2017

Forex Varsity Qtableview Verstecken


, Kleine Taschenlampe. . Tiny Taschenlampe - Android Market,: - -,. - - - -. Aufrechtzuerhalten. Aufrechtzuerhalten. Aufrechtzuerhalten. ,. ,,, . Tiny Taschenlampe -,. Aufrechtzuerhalten. . . Aufrechtzuerhalten. . Aufrechtzuerhalten. . . . ,, 3.7 (), Spielmarkt,)) Jeder UI-Entwickler sollte über ModelView-Programmierung wissen und das Ziel dieses Tutorials ist es, Ihnen eine leicht verständliche Einführung in dieses Thema zu bieten. Tabellen-, Listen - und Baum-Widgets sind Komponenten, die häufig in GUIs verwendet werden. Es gibt 2 verschiedene Möglichkeiten, wie diese Widgets auf ihre Daten zugreifen können. Die traditionelle Art beinhaltet Widgets, die interne Container für die Speicherung von Daten enthalten. Dieser Ansatz ist sehr intuitiv, aber in vielen nicht-trivialen Anwendungen führt es zu Datensynchronisierungsproblemen. Der zweite Ansatz ist Modelview-Programmierung, bei der Widgets keine internen Datencontainer pflegen. Sie greifen auf externe Daten über eine standardisierte Schnittstelle zu und vermeiden daher die Datenvervielfältigung. Dies mag zunächst kompliziert erscheinen, aber sobald man genauer hinsieht, ist es nicht nur leicht zu begreifen, aber die vielen Vorteile der Modelview-Programmierung werden auch deutlicher. , Qt,: Der Unterschied zwischen Standard - und Modelview-Widgets Adapters zwischen Formularen und Modellen Entwicklung einer einfachen Modelview-Anwendung Vordefinierte Modelle Intermediäre Themen wie: Baumansichten Auswahl Debugging mit Modelltest Sie erfahren auch, ob Ihre neue Applikation mit der Modellview-Programmierung einfacher geschrieben werden kann Oder wenn klassische Widgets genauso gut funktionieren. Dieses Tutorial enthält Beispielcode für Sie zu bearbeiten und zu integrieren in Ihr Projekt. Der Tutorials Quellcode befindet sich im QTS examplestutorialsmodelview Verzeichnis. Für genauere Informationen können Sie sich auch die Referenzdokumentation Qt, Qt anschauen. . 1. ModelView ist eine Technologie, die verwendet wird, um Daten aus Ansichten in Widgets zu trennen, die Datensätze behandeln. Standard-Widgets sind nicht für die Trennung von Daten aus Ansichten konzipiert und deshalb hat Qt 4 zwei verschiedene Arten von Widgets. Beide Arten von Widgets sehen gleich aus, aber sie interagieren mit Daten unterschiedlich. Standard-Widgets verwenden Daten, die Teil des Widgets sind. View-Klassen operieren auf externe Daten (das Modell) 1.1 Standard-Widgets Lets haben einen genaueren Blick auf ein Standard-Tabellen-Widget. Ein Tabellen-Widget ist ein 2D-Array der Datenelemente, die der Benutzer ändern kann. Das Tabellen-Widget kann in einen Programmablauf integriert werden, indem man die Datenelemente liest und schreibt, die das Tabellen-Widget bereitstellt. Diese Methode ist sehr intuitiv und nützlich in vielen Anwendungen, aber das Anzeigen und Bearbeiten einer Datenbanktabelle mit einem Standard-Tabellen-Widget kann problematisch sein. Zwei Kopien der Daten müssen koordiniert werden: eine außerhalb des Widgets im Inneren des Widgets. Der Entwickler ist verantwortlich für die Synchronisierung beider Versionen. Daneben macht die enge Kopplung von Präsentation und Daten es schwieriger, Unit-Tests zu schreiben. 1.2 ModelView zur Rescue Modelview trat auf, um eine Lösung zu bieten, die eine vielseitigere Architektur verwendet. Modelview eliminiert die Datenkonsistenzprobleme, die bei Standard-Widgets auftreten können. Modelview macht es auch einfacher, mehr als eine Ansicht der gleichen Daten zu verwenden, weil ein Modell an viele Ansichten weitergegeben werden kann. Der wichtigste Unterschied ist, dass Modelview-Widgets keine Daten hinter den Tabellenzellen speichern. Tatsächlich arbeiten sie direkt aus Ihren Daten. Da View-Klassen Ihre Datenstruktur nicht kennen, müssen Sie einen Wrapper zur Verfügung stellen, um Ihre Daten an die QAbstractItemModel-Schnittstelle anzupassen. Eine Ansicht verwendet diese Schnittstelle zum Lesen und Schreiben an Ihre Daten. Jede Instanz einer Klasse, die QAbstractItemModel implementiert, soll ein Modell sein. Sobald die Ansicht einen Zeiger auf ein Modell erhält, liest und zeigt es seinen Inhalt an und ist sein Editor. 1.3 Überblick über die ModelView Widgets Hier ist ein Überblick über die Modelview-Widgets und die entsprechenden Standard-Widgets. (Eine Item-basierte Convenience-Klasse) QComboBox kann sowohl als View-Klasse als auch als traditionelles Widget arbeiten 1.4 Verwenden von Adaptern zwischen Formularen und Modellen Mit Adaptern zwischen Formularen und Modellen können Sie sich als nützlich erweisen. Wir können die in Tabellen gespeicherten Daten direkt aus der Tabelle selbst bearbeiten, aber es ist viel bequemer, Daten in Textfeldern zu bearbeiten. Es gibt kein direktes Modelview-Pendant, das Daten und Ansichten für Widgets trennt, die auf einem Wert (QLineEdit. QCheckBox.) Anstelle eines Datensatzes arbeiten. Daher benötigen wir einen Adapter, um das Formular mit der Datenquelle zu verbinden. QDataWidgetMapper ist eine großartige Lösung, weil es Formular-Widgets zu einer Tabellenzeile abbildet und es sehr einfach macht, Formulare für Datenbanktabellen zu erstellen. Ein weiteres Beispiel für einen Adapter ist QCompleter. Qt hat QCompleter für die Bereitstellung von Auto-Completions in Qt Widgets wie QComboBox und, wie unten gezeigt, QLineEdit. QCompleter verwendet ein Modell als Datenquelle. 2. Wenn du eine Modelview-Anwendung entwickeln willst, wo sollst du anfangen Wir empfehlen, mit einem einfachen Beispiel zu beginnen und es Schritt für Schritt zu erweitern. Das macht das Verständnis der Architektur viel einfacher. Der Versuch, die Modelview-Architektur im Detail zu verstehen, bevor man die IDE anruft, hat sich für viele Entwickler als weniger günstig erwiesen. Es ist wesentlich einfacher, mit einer einfachen Modelview-Anwendung zu beginnen, die Demo-Daten hat. Probieren Sie es aus. Ersetzen Sie einfach die Daten in den folgenden Beispielen mit Ihren eigenen. Im Folgenden sind 7 sehr einfache und unabhängige Anwendungen, die verschiedene Seiten der Modelview-Programmierung zeigen. Der Quellcode befindet sich im Verzeichnis examplestutorialsmodelview. 2.1 Eine Nur-Lese-Tabelle Wir beginnen mit einer Anwendung, die ein QTableView verwendet, um Daten anzuzeigen. Wir werden später Bearbeitungsmöglichkeiten hinzufügen. (File source: examplestutorialsmodelview1readonlymain. cpp) Wir haben die übliche main () Funktion: Hier ist der interessante Teil: Wir erstellen eine Instanz von MyModel und verwenden tableView. setModel (ampmyModel), um einen Zeiger davon an tableView zu übergeben. TableView ruft die Methoden des Zeigers auf, den es erhalten hat, um zwei Dinge herauszufinden: Wie viele Zeilen und Spalten sollten angezeigt werden. Welche Inhalte sollten in jede Zelle gedruckt werden. Das Modell braucht etwas Code, um darauf zu antworten. Wir haben einen Tabellen-Datensatz, also können wir mit QAbstractTableModel starten, da es einfacher zu bedienen ist als das allgemeinere QAbstractItemModel. (: Examplestutorialsmodelview1readonlymymodel. h) QAbstractTableModel. (: Examplestutorialsmodelview1readonlymymodel. cpp) Die Anzahl der Zeilen und Spalten wird von MyModel :: rowCount () und MyModel :: columnCount () bereitgestellt. Wenn die Ansicht wissen muss, was der Zellentext ist, ruft sie die Methode MyModel :: data () auf. Zeilen - und Spalteninformationen werden mit Parameterindex angegeben und die Rolle auf Qt :: DisplayRole gesetzt. Andere Rollen werden im nächsten Abschnitt behandelt. In unserem Beispiel werden die Daten angezeigt, die angezeigt werden sollen. In einer echten Anwendung würde MyModel ein Mitglied namens MyData haben. Die als Ziel für alle Lese - und Schreiboperationen dient. Dieses kleine Beispiel zeigt die passive Natur eines Modells. Das Modell weiß nicht, wann es benutzt wird oder welche Daten benötigt werden. Es gibt einfach Daten, jedes Mal, wenn die Ansicht es anfordert. Was passiert, wenn die Modelldaten geändert werden müssen Wie sieht die Ansicht aus, dass sich die Daten geändert haben und wieder gelesen werden müssen. Das Modell muss ein Signal aussenden, das angibt, welcher Bereich der Zellen sich geändert hat. Dies wird in Abschnitt 2.3 gezeigt. 2.2 Verlängern des Read Only-Beispiels mit Rollen Zusätzlich zur Steuerung des Textes, den die Ansicht anzeigt, steuert das Modell auch die Texte. Wenn wir das Modell etwas ändern, erhalten wir folgendes Ergebnis: In der Tat muss nichts außer der data () - Methode geändert werden, um Schriften, Hintergrundfarbe, Ausrichtung und ein Kontrollkästchen festzulegen. Unten ist die Methode data (), die das oben gezeigte Ergebnis erzeugt. Der Unterschied ist, dass wir dieses Mal die Parameter int-Rolle verwenden, um je nach Wert unterschiedliche Informationen zurückzugeben. (: Examplestutorialsmodelview2formattingmymodel. cpp) Jede Formatierungseigenschaft wird vom Modell mit einem separaten Aufruf der data () - Methode angefordert. Der Rollenparameter wird verwendet, um das Modell zu informieren, welche Eigenschaft angefordert wird: In der Qt-Namespace-Dokumentation erfahren Sie mehr über die QT :: ItemDataRole-Enums-Funktionen. Jetzt müssen wir feststellen, wie die Verwendung eines separaten Modells die Anwendungsleistung beeinflusst. So können wir verfolgen, wie oft die Ansicht die Methode data () aufruft. Um zu verfolgen, wie oft die Ansicht das Modell aufruft, haben wir eine Debug-Anweisung in die data () - Methode gesetzt, die sich auf dem Fehlerausgabestream anmeldet. In unserem kleinen Beispiel wird data () 42 mal genannt. Jedes Mal, wenn du den Cursor über das Feld schwebst, wird data () für jede Zelle 7mal wieder aufgerufen. Deshalb ist es wichtig, sicherzustellen, dass Ihre Daten verfügbar sind, wenn data () aufgerufen wird und teure Lookup-Operationen zwischengespeichert werden. 2.3 Eine Uhr in einer Tischzelle Wir haben noch eine nur Tabelle, aber dieses Mal ändert sich der Inhalt jede Sekunde, weil wir die aktuelle Zeit zeigen. (: Examplestutorialsmodelview3changingmodelmymodel. cpp) Etwas fehlt, um die Uhr zu ticken. Wir müssen der Ansicht jede Sekunde erzählen, dass sich die Zeit geändert hat und dass es wieder gelesen werden muss. Wir machen das mit einem Timer. Im Konstruktor setzen wir sein Intervall auf 1 Sekunde und verbinden sein Timeout-Signal. (: Examplestutorialsmodelview3changingmodelmymodel. cpp) Hier ist der entsprechende Slot: (: examplestutorialsmodelview3changingmodelmymodel. cpp) Wir bitten die Ansicht, die Daten in der oberen linken Zelle wieder zu lesen, indem wir das dataChanged () - Signal ausgeben. Beachten Sie, dass wir das dataChanged () - Signal nicht explizit an die Ansicht anschließen. Dies geschah automatisch, wenn wir setModel () angerufen haben. 2.4 Kopfzeilen für Spalten und Zeilen einrichten Header können über eine View-Methode ausgeblendet werden: tableView-gtverticalHeader () - gthide () Der Header-Inhalt wird jedoch über das Modell gesetzt, so dass wir die headerData () - Methode neu implementieren: (: examplestutorialsmodelview4headersmymodel. cpp) Beachten Sie, dass die Methode headerData () auch eine Parameterrolle hat, die die gleiche Bedeutung hat wie in MyModel :: data (). 2.5 Das Minimal Editing Beispiel In diesem Beispiel werden wir eine Anwendung erstellen, die automatisch einen Fenstertitel mit Inhalt durch Wiederholen von in Tabellenzellen eingegebenen Werten füllt. Um auf den Fenstertitel zugreifen zu können, setzen wir den QTableView in einen QMainWindow. Das Modell entscheidet, ob Bearbeitungsmöglichkeiten verfügbar sind. Wir müssen nur das Modell modifizieren, damit die verfügbaren Bearbeitungsmöglichkeiten aktiviert werden können. Dies geschieht durch die Wiederherstellung der folgenden virtuellen Methoden: setData () und Flags (). (: Examplestutorialsmodelview5editmymodel. h) Wir verwenden das zweidimensionale Array QString mgridData, um unsere Daten zu speichern. Das macht mgridData zum Kern von MyModel. Der Rest von MyModel wirkt wie ein Wrapper und passt mgridData an die QAbstractItemModel-Schnittstelle an. Wir haben auch das editCompleted () - Signal eingeführt, das es ermöglicht, den geänderten Text in den Fenstertitel zu übertragen. (: Examplestutorialsmodelview5editmymodel. cpp) setData () wird jedes Mal aufgerufen, wenn der Benutzer eine Zelle bearbeitet. Der Indexparameter gibt an, welches Feld bearbeitet wurde und der Wert liefert das Ergebnis des Editiervorgangs. Die Rolle wird immer auf Qt :: EditRole gesetzt, da unsere Zellen nur Text enthalten. Wenn ein Kontrollkästchen vorhanden ist und Benutzerberechtigungen so eingestellt sind, dass das Kontrollkästchen aktiviert werden kann, werden auch Anrufe mit der Rolle vorgenommen, die auf Qt :: CheckStateRole gesetzt ist. (: Examplestutorialsmodelview5editmymodel. cpp) Verschiedene Eigenschaften einer Zelle können mit Flags () angepasst werden. Wenn das Editieren einer Zelle mehr Daten als die Daten in dieser bestimmten Zelle modifiziert, muss das Modell ein dataChanged () - Signal ausgeben, damit die Daten, die geändert wurden, gelesen werden. 3. Intermediate Topics 3.1 TreeView Sie können das obige Beispiel in eine Anwendung mit einer Baumansicht umwandeln. Ersetzen Sie einfach QTableView mit QTreeView. Was zu einem Readwrite-Baum führt. Es müssen keine Änderungen am Modell vorgenommen werden. Der Baum hat keine Hierarchien, weil hier irgendwelche Hierarchien im Modell selbst vorhanden sind. QListView QTableView und QTreeView alle verwenden eine Modell Abstraktion, die eine zusammengeführte Liste, Tabelle und Baum ist. Dies macht es möglich, mehrere verschiedene Arten von Ansichtsklassen aus dem gleichen Modell zu verwenden. So sieht unser Beispielmodell so weit aus: Wir wollen einen echten Baum präsentieren. Wir haben unsere Daten in die obigen Beispiele eingehüllt, um ein Modell zu machen. Dieses Mal verwenden wir QStandardItemModel. Das ist ein Container für hierarchische Daten, die auch QAbstractItemModel implementiert. Um einen Baum zu zeigen, muss QStandardItemModel mit QStandardItem s gefüllt werden, die alle Standard-Eigenschaften von Elementen wie Text, Schriften, Checkboxen oder Pinsel halten können. (: Examplestutorialsmodelview6treeviewmainwindow. cpp) Wir instanziieren einfach ein QStandardItemModel und fügen ein paar QStandardItems zum Konstruktor hinzu. Wir können dann eine hierarchische Datenstruktur erstellen, da ein QStandardItem andere QStandardItems halten kann. Die Knoten werden in der Ansicht zusammengebrochen und erweitert. 3.2 Arbeiten mit Selektionen Wir möchten auf einen ausgewählten Items-Content zugreifen, um ihn mit der Hierarchieebene in den Fenstertitel auszugeben. So können wir ein paar Elemente erstellen: (: examplestutorialsmodelview7selections mainwindow. cpp) Ansichten verwalten Selektionen innerhalb eines separaten Selektionsmodells, das mit der selectModel () - Methode abgerufen werden kann. Wir holen das Auswahlmodell ab, um einen Slot mit seinem selectionChanged () - Signal zu verbinden. (: Examplestutorialsmodelview7selections mainwindow. cpp) Wir erhalten den Modellindex, der der Auswahl entspricht, indem er treeView-gtselectionModel () - gtcurrentIndex () aufruft und wir die Felder String mit dem Modellindex erhalten. Dann berechnen wir einfach die Items hierarchyLevel. Top-Level-Elemente haben keine Eltern und die parent () - Methode gibt einen standardmäßig konstruierten QModelIndex () zurück. Aus diesem Grund verwenden wir die parent () - Methode, um auf die obere Ebene zu iterieren, während wir die während der Iteration durchgeführten Schritte zählen. Das Auswahlmodell (wie oben gezeigt) kann abgerufen werden, kann aber auch mit QAbstractItemView :: setSelectionModel gesetzt werden. So ist es möglich, 3 View-Klassen mit synchronisierten Selektionen zu haben, da nur eine Instanz eines Selektionsmodells verwendet wird. Um ein Auswahlmodell zwischen 3 Ansichten zu teilen, verwenden Sie selectModel () und ordnen das Ergebnis der zweiten und dritten Ansichtsklasse mit setSelectionModel () zu. 3.3 Vordefinierte Modelle Die typische Art, Modelview zu verwenden, besteht darin, spezifische Daten zu verpacken, um sie mit View-Klassen verwendbar zu machen. Qt liefert aber auch vordefinierte Modelle für gemeinsame zugrunde liegende Datenstrukturen. Wenn eine der verfügbaren Datenstrukturen für Ihre Anwendung geeignet ist, kann ein vordefiniertes Modell eine gute Wahl sein. Speichert eine Liste von Strings Sortiert und filtert ein anderes Modell 3.4 In allen bisherigen Beispielen werden Daten als Text oder ein Kontrollkästchen in einer Zelle dargestellt und als Text oder als Kontrollkästchen bearbeitet. Die Komponente, die diese Präsentations - und Bearbeitungsdienste bereitstellt, heißt Delegierter. Wir sind gerade erst damit beschäftigt, mit dem Delegierten zu arbeiten, da die Ansicht einen Default-Delegierten verwendet. Aber stellen Sie sich vor, dass wir einen anderen Editor haben wollen (z. B. einen Slider oder eine Dropdown-Liste) oder stellen Sie sich vor, dass wir Daten als Grafik präsentieren möchten. Werfen wir einen Blick auf ein Beispiel namens Star Delegate. In denen Sterne verwendet werden, um eine Bewertung zu zeigen: Die Ansicht hat eine setItemDelegate () - Methode, die den Default Delegate ersetzt und einen benutzerdefinierten Delegierten installiert. Ein neuer Delegierter kann geschrieben werden, indem eine Klasse erstellt wird, die von QStyledItemDelegate erbt. Um einen Delegierten zu schreiben, der Sterne anzeigt und keine Eingabemöglichkeiten hat, müssen wir nur 2 Methoden überschreiben. Paint () zeichnet Sterne je nach Inhalt der zugrunde liegenden Daten. Die Daten können mit dem Aufruf von index. data () nachgeschlagen werden. Die Delegate sizeHint () - Methode wird verwendet, um jede Sterne Dimensionen zu erhalten, so dass die Zelle genügend Höhe und Breite zur Aufnahme der Sterne bieten wird. Das Schreiben von benutzerdefinierten Delegierten ist die richtige Wahl, wenn Sie Ihre Daten mit einer benutzerdefinierten grafischen Darstellung innerhalb des Rasters der View-Klasse anzeigen möchten. Wenn du das Raster verlassen möchtest, würdest du keinen benutzerdefinierten Delegierten verwenden, sondern eine benutzerdefinierte Ansichtsklasse. Weitere Verweise auf Delegierte in Qt Dokumentation: 3.5 Debugging mit ModelTest Die passive Art der Modelle bietet neue Herausforderungen für Programmierer. Inkonsistenzen im Modell können die Anwendung zum Absturz bringen. Da das Modell von zahlreichen Anrufen aus der Sicht getroffen wird, ist es schwer, herauszufinden, welcher Anruf die Anwendung abgestürzt hat und welche Operation das Problem eingeführt hat. Qt Labs bietet Software namens ModelTest. Die die Modelle während der Programmierung überprüft. Jedes Mal, wenn das Modell geändert wird, scannt ModelTest das Modell und berichtet Fehler mit einem Assert. Dies ist besonders wichtig für Baummodelle, da ihre hierarchische Natur viele Möglichkeiten für subtile Inkonsistenzen hinterlässt. Im Gegensatz zu Ansichtsklassen verwendet ModelTest außerhalb der Bereichsindizes, um das Modell zu testen. Dies bedeutet, dass Ihre Anwendung mit ModelTest abstürzen kann, auch wenn es ohne sie läuft. So müssen Sie auch alle Indizes behandeln, die bei der Verwendung von ModelTest außerhalb des Bereichs liegen. 4. ModelView Programmierung ist sehr umfangreich in der Dokumentation von Qt, sondern auch in mehreren guten Büchern abgedeckt. C GUI Programmierung mit Qt 4 Jasmin Blanchette, Mark Summerfield, Prentice Hall, 2. Auflage. ISBN 0-13-235416-0. Auch in deutscher Sprache: C GUI Programmierung mit Qt 4: Die offizielle Einfhrung. Addison-Wesley. ISBN 3-827327-29-6 Das Buch von Qt4, Die Kunst des Gebäudes Qt Anwendungen Daniel Molkentin, Open Source Press. ISBN 1-59327-147-6 Übersetzt aus Qt 4, Einfhrung in die Applikationsentwicklung. Open Source Presse. ISBN 3-937514-12-0. Grundlagen der Qt-Entwicklung Johan Thelin, Apress. ISBN 1-59059-831-8 Erweiterte Qt Programmierung Mark Summerfield, Prentice Hall. ISBN 0-321-63590-6. Dieses Buch umfasst ModelView-Programmierung auf mehr als 150 Seiten. Weitere Informationen zu diesen Büchern finden Sie auf der Qt-Website. Die folgende Liste gibt einen Überblick über Beispielprogramme, die in den ersten drei oben aufgeführten Büchern enthalten sind. Einige von ihnen machen sehr gute Vorlagen für die Entwicklung ähnlicher Anwendungen. Umfassende benutzerdefinierte Delegate Beispiel. Demonstrationen ähneln den Beispielen, mit der Ausnahme, dass für den Code keine Komplettlösung vorgesehen ist. Demonstrationen sind typischerweise reicher als Beispiele. Die Interview-Demonstration zeigt das gleiche Modell und die Auswahl, die zwischen drei verschiedenen Ansichten geteilt wird. Die Tabellenkalkulation demonstriert die Verwendung einer Tabellenansicht als Tabellenkalkulation, wobei benutzerdefinierte Delegierte verwendet werden, um jedes Element entsprechend der Art der darin enthaltenen Daten zu rendern. Ein Referenzdokument für die Modellansichtstechnik steht ebenfalls zur Verfügung. 2008-2011 Nokia Corporation. Nokia, Qt Nokia Corporation. . , Qt, Qt,,,,, Nokia. , GNU Free Documentation License Version 1.3. Freie Software Foundation. Qt. ,: Qt. Aufrechtzuerhalten.

No comments:

Post a Comment