2016-06-22 13 views
1

Ich verwende Qt 5.6 und mein Ziel ist es, eine dynamische Struktur mit QTreeView zu entwickeln, die Elemente wie Kombinationsfelder, Bearbeitungsfeld, Kontrollkästchen, Schaltflächen usw. abhängig von den Einstellungen und geladen werden muss Die Baumdaten können sich ändern, wenn neue Daten geladen werden. Es wird viele Knoten geben, die in der Struktur mit Eltern- und Kindknoten gefüllt werden.dynamische qtreeview mit benutzerdefinierten Delegaten

Ich habe über verschiedene Optionen gelesen, um diese Art von Treeview zu implementieren, wie das Auffüllen eines QTreeView und das Implementieren meines eigenen Delegaten durch Erben von QITemDelegate oder QStyledItemDelegate oder mithilfe von Qt Quicks QML-Treeview.

Für meine Zwecke habe ich die erste Option ausgewählt, um dynamisch einen Baum zu bevölkern und Parameter zu ändern, aber ich habe Probleme, den Delegaten für eine ausgewählte Zelle nur als die einzigen Optionen zum Festlegen des Delegaten in der Struktur festlegen setItemDelegateForRow, setItemDelegateForColumn oder setItemDelegate. Der Baum wird ungefähr wie folgt aussehen. Wie sollte ich einen anderen Delegaten für jeden der untergeordneten Knoten festlegen?

by (col, row) 

Parent(cell 0,0) 
    ->Child(cell 0,1) -combo box(1,1) 
    ->Child(cell 0,2) -button(1,2) 
    ->Child(cell 0,3) -check box(1,3) 
... 
...etc 

Parent(cell 0,10) 
    ->Child(cell 0,11) - edit box(1,11) 
    ->Child(cell 0,12) - edit box(1,12) 
    ->Child(cell 0,13) - check box(1,13) 
... 
...etc 

bearbeiten

Dies ist eine vereinfachte Version von, wie ich bisher Ansicht meines Baumes-Setup. Ich fand heraus, warum meine Kindknotenspalte 1 nicht angezeigt wurde, weil ich die Spaltenanzahl des Modells nicht festgelegt hatte. Ich habe den Code unten aktualisiert und es funktioniert jetzt.

enum EditType 
{ 
    TYPE_Text, 
    TYPE_CheckBox, 
    TYPE_ComboBox, 
    TYPE_Button 
}; 

QTreeView* tree = new QTreeView(this); 
QStandardItemModel* model = new QStandardItemModel; 
model->setColumnCount(2); 
tree->setModel(model); 

//set custom delegate for column 1 of the tree 
CustomDelegate *customDelegate = new CustomDelegate(this); 
tree->setItemDelegateForColumn(1, customDelegate); 

// Add parent nodes 
QStandardItem* parent1 = new QStandardItem(tr("parent1")); 
QStandardItem* parent2 = new QStandardItem(tr("parent2")); 

model->appendRow(parent1); 
model->appendRow(parent2); 

// add a child 
QList<QStandardItem*> childrow; 
QStandardItem* child = new QStandardItem(tr("child1")); 
childrow.append(child); 
QStandardItem* child_value = new QStandardItem(); 
child_value->setData(TYPE_ComboBox, Qt::UserRole); 
childrow.append(child_value); 
parent1->appendRow(it_child); 
+0

überprüfen Sie diese: https://github.com/commontk/QtPropertyBrowser, https://github.com/intbots/QtPropertyBrowser, https://doc.qt.io/ archives/qq/qq18-propertybrowser.html – mvidelgauz

Antwort

0

Wie Sie aus QAbstractItemView documentation sehen können, gibt es nur Methoden für Satz Delegat für
ganze Sicht, für Spalten oder Zeilen. Wie Sie bemerkt haben, sind diese Methoden: setItemDelegate, setItemDelegateForColumn, setItemDelegateForRow. Aus diesem Grund können Sie den Delegaten nicht für bestimmte Zellen festlegen.

Es gibt eine andere Möglichkeit, die Sie verwenden können, um verschiedene Widgets in QTreeView anzuzeigen - Methode SetIndexWidget von QAbstractItemView. Aber Sie müssen bedenken, dass:

Diese Funktion sollte nur verwendet werden, um statische Inhalte im sichtbaren Bereich angezeigt werden, entsprechend einem Datenelement. Wenn Sie den benutzerdefinierten dynamischen Inhalt anzeigen oder ein benutzerdefiniertes Editor-Widget implementieren möchten, verwenden Sie stattdessen die Unterklasse QItemDelegate.

Verwenden SetIndexWidget Methode ist sehr „teuer“ und wenn Sie viele Zeilen in Ihnen QTreeView haben, können Sie eine Leistungsverschlechterung sehen.

Zusatz: Wenn Sie Widgets in QTreeView nur für die Bearbeitung von Daten Elemente aus Ihrem Modell, die beste Art und Weise Sie zu lösen Problem QStyledItemDelegate reimplementieren wird. Suchen Sie nach der Methode createEditor.

Zusatz: Example of reimplement QStyledItemDelegate

+0

Danke für Ihre Eingabe. Da meine Baumansicht groß ist und viele Datensätze enthält, ist es wahrscheinlich nicht gut, setIndexWidget zu verwenden. Wenn ich QStyledItemDelegate neu implementiere und createEditor ändere, um den Editor abhängig vom QModelIndex-Index zu setzen, wie setze ich ihn dann für eine bestimmte Kindzelle in meinem Modell ein? – ccptleu

+0

Wenn Sie spezifische Widget wissen, die in bestimmten Zelle sein wird - Sie kennen QModelIndex für diese Zelle. Wenn Sie createEditor neu implementieren, müssen Sie ein bestimmtes Widget für einen bestimmten QModelIndex zurückgeben. Ich sehe das Problem nicht. Algorithmus ist der gleiche, den Sie verwenden, wenn Sie bestimmen, welches Widget in einer bestimmten Zelle sein muss. Wenn Sie beispielsweise für die erste Spalte SomeWidget zum Bearbeiten verwenden möchten, führen Sie eine solche Überprüfung in createEditor-Reimplementierung durch: if (index.column() == 0) SomeWidget zurückgeben; Etwas wie das. –

+0

Eigentlich habe ich, nachdem ich diese Frage gestellt habe, eine Lösung implementiert, die ich in meinem ersten Beitrag hinzugefügt habe. Vielen Dank! – ccptleu

Verwandte Themen