Seite 1 von 1

Verständnisproblem QAbstractItemModel

Verfasst: 16. Oktober 2014 16:51
von Artemus
Hallo,

ich habe gerade ein Problem den Ausgangspunkt für eine aktuelle Aufgabenstellung zu finden.
Was ich machen möchte ist ein paar Daten in einem TreeView darzustellen bzw. zu editieren. Allerding ist die Darstellungsform Abhängig von dem jeweiligen Datensatz.

Hier mal ein Bild um das zu veranschaulichen:
Bild
Wie man sieht soll die Spalte "Value" sowohl dezimalzahlen, eine Checkbox oder dropdown Menü verwenden um den eigentlichen Wert darzustellen bzw. zu verändern (hexwerte in 0x... Notation sind auch vorgesehen).
Ich habe mir schon mal einen struct gebaut so wie ich die Daten im Speicher hinterlegen will:

Code: Alles auswählen

typedef struct{
    uint8          au8_Name[255];
    uint32         u32_value;
    uint8          u8_pos;
    uint8          u8_length;
    uint32         u32_resetvalue;
    EN_DISPLAYTYPE en_displaytype;
    QStringList*   qp_dropdown_options;
}ST_REGISTER_OPTION;
EN_DISPLAYTYPE gibt dabei die Darstellungsform an.

Die Daten liegen dann in einem eindimensionalem Array z.B.

Code: Alles auswählen

ST_REGISTER_OPTION ast_register[MAX_REG_COUNT];
So, nun muss ich ja einen "Übersetzer" bauen um meinen struct in einem Treeview darzustellen.
Bin ich da prinzipiell mit einem Subclass von QAbstractItemModel gut beraten?
Und schreibe ich dann eine Klasse die alle 5 Spalten von Name bis Value darstellt oder muss ich für die ersten 4 Felder eine Standardklasse nehmen und meine eigene kümmert sich nur um das Value Feld?
Wie bringe ich dem ganzen bei wo und wie meine Daten liegen?

Re: Verständnisproblem QAbstractItemModel

Verfasst: 16. Oktober 2014 17:10
von nebler
Hallo,

also wenn es um eine flache Datenstruktur geht, würde ich mir eher QAbstractTableModel genauer anschauen.
Das Model selbst stellt allerdings nicht den Editor zur Verfügung, das macht das QItemDelegate.

Um das Beispiel, das Du aufzeigst, allerdings zu imitieren, würde ich folgende Lösung vorschlagen:

Code: Alles auswählen

class MyTableWidget : public QTableWidget {
  Q_OBJECT
public:
  void setData( const ST_REGISTER_OPTION& in ) {
     // write to widget
     switch( in.en_displayType ) {
     case CheckBox:        
        setCellWidget( row, col, new QCheckBox() );
        break;
     }
  }

  ST_REGISTER_OPTION getData() const {
    // read from widget ...
  }
};
Mir ist nicht bekannt, wenn man von QAbstractItemModel / QItemDelegate ableitet, dass das Editor Widget dann dauerhaft dargestellt wird.
Sonst hätte Qt wohl selbst nicht eine Methode 'setCellWidget' eingeführt.

Viele Grüße

Re: Verständnisproblem QAbstractItemModel

Verfasst: 17. Oktober 2014 08:41
von Artemus
Die flache Datenstruktur ist erst einmal für den Anfang gedacht, später sollte es schon mal eine Art Baum werden. Ich schau mir deinen Vorschlag mal genauer an, sieht schon mal sehr gut aus. Den Baum könnte ich auch durch simple Buttons mit Stylesheet ersetzen. Habe maximal 3 Ebenen.