Το πρότυπο
Κάθε Gtk::TreeView έχει μια συνδεμένη Gtk::TreeModel, που περιέχει τα εμφανιζόμενα δεδομένα από την TreeView. Κάθε Gtk::TreeModel μπορεί να χρησιμοποιηθεί από περισσότερες από μία Gtk::TreeView. Για παράδειγμα, αυτό επιτρέπει τα ίδια υποκείμενα δεδομένα να εμφανίζονται και να επεξεργάζονται με 2 διαφορετικούς τρόπους ταυτόχρονα. Ή οι 2 προβολές μπορεί να εμφανίζουν διαφορετικές στήλες από τα ίδια δεδομένα του προτύπου, κατά τον ίδιο τρόπο που 2 ερωτήματα SQL (ή "προβολές") μπορείνα εμφανίζουν διαφορετικά πεδία από τον ίδιο πίνακα βάσης δεδομένων.
Αν και μπορείτε θεωρητικά να υλοποιήσετε το δικό σας πρότυπο, θα χρησιμοποιείτε κανονικά τις κλάσεις προτύπου ή την ListStore ή την TreeStore.
- 10.1.1. Αποθήκευση λίστας (ListStore), για γραμμές
- 10.1.2. Αποθήκευση δένδρου, για μια ιεραρχία
- 10.1.3. Στήλες προτύπου
- 10.1.4. Προσθήκη γραμμών
- 10.1.5. Ορισμός τιμών
- 10.1.6. Λήψη τιμών
- 10.1.7. "Κρυφές" στήλες
10.1.1. Αποθήκευση λίστας (ListStore), για γραμμές
Η ListStore περιέχει απλές γραμμές δεδομένων και κάθε γραμμή δεν έχει θυγατρικά.
10.1.2. Αποθήκευση δένδρου, για μια ιεραρχία
Η TreeStore περιέχει γραμμές δεδομένων και κάθε γραμμή μπορεί να έχει θυγατρικές γραμμές.
10.1.3. Στήλες προτύπου
Η κλάση TreeModelColumnRecord χρησιμοποιείται για διατήρηση ανίχνευσης των στηλών και των τύπων δεδομένων τους. Προσθέτετε στιγμιότυπα TreeModelColumn στη ColumnRecord και έπειτα τα χρησιμοποιείτε στη TreeModelColumns, όταν παίρνετε και ορίζετε τα δεδομένα στις γραμμές του προτύπου. Θα το βρείτε προφανώς βολικό να παράξετε μια νέα TreeModelColumnRecord που έχει τα στιγμιότυπά σας στη TreeModelColumn ως δεδομένα μέλους.
class ModelColumns : public Gtk::TreeModelColumnRecord { public: ModelColumns() { add(m_col_text); add(m_col_number); } Gtk::TreeModelColumn<Glib::ustring> m_col_text; Gtk::TreeModelColumn<int> m_col_number; }; ModelColumns m_Columns;
Ορίζετε την ColumnRecord όταν δημιουργείτε το πρότυπο, ως εξής:
Glib::RefPtr<Gtk::ListStore> refListStore = Gtk::ListStore::create(m_Columns);
As a TreeModelColumnRecord describes structure, not data, it can be shared among multiple models, and this is preferable for efficiency. However, the instance (such as m_Columns here) should usually not be static, because it often needs to be instantiated after glibmm has been initialized. The best solution is to make it a lazily instantiated singleton, so that it will be constructed on-demand, whenever the first model accesses it.
10.1.4. Προσθήκη γραμμών
Προσθέστε γραμμές στο πρότυπο με τις μεθόδους append(), prepend(), ή insert().
auto iter = m_refListStore->append();
Μπορείτε να αφαιρέσετε την αναφορά από τον επαναλήπτη για να πάρετε τη γραμμή:
auto row = *iter;
- 10.1.4.1. Προσθήκη θυγατρικών γραμμών
10.1.5. Ορισμός τιμών
You can use the operator[] overload to set the data for a particular column in the row, specifying the TreeModelColumn used to create the model.
row[m_Columns.m_col_text] = "sometext";
10.1.6. Λήψη τιμών
You can use the operator[] overload to get the data in a particular column in a row, specifying the TreeModelColumn used to create the model.
auto strText = row[m_Columns.m_col_text]; auto number = row[m_Columns.m_col_number];
Ο μεταγλωττιστής θα παραπονεθεί αν χρησιμοποιήσετε έναν ακατάλληλο τύπο. Για παράδειγμα, αυτό θα μπορούσε να δημιουργήσει ένα σφάλμα μεταγλωττιστή:
//compiler error - no conversion from ustring to int. int number = row[m_Columns.m_col_text];