Seite 1 von 1
Fragen mit selectedIndex aus QTreeView
Verfasst: 12. März 2011 01:03
von forgoden
Es geht mir darum, alle ausgewählten Items aus QTreeView anzusprechen. Doch diese Methoden dafür sind irgendwie schwer ansprechbar.
folgendes geht nicht:
treeWidget->selectedIndexes();
warum weiss ich nicht. in der Dokumentation steht [virtual protected] weiss nicht, was es bedeutet.
Ich konnte damit umgehen, indem ich folgendes gemacht habe
Code: Alles auswählen
QModelIndexList TreeViewOM::getSelectedIndex() {
return selectedIndexes();
}
dann geht:
qDebug() << treeWidget->getSelectedIndex();
jetzt will ich alle ausgewählten items löschen
das hier geht nicht:
treeWidget->getSelectedIndex().at(i).model().removeRow(i);
es geht nur bis .model()
irgendwie hab ich auch mit dynamic_cast versucht aber ich blick mit den ganzen Zeiger und const nicht durch.
Dabei will ich doch nur alle ausgewählten Items aus QTreeView löschen.
Verfasst: 12. März 2011 08:04
von upsala
warum weiss ich nicht. in der Dokumentation steht [virtual protected] weiss nicht, was es bedeutet.
Das bedeutet, daß du C++-Grundlagen lernen sollst.
Verfasst: 12. März 2011 10:11
von padreigh
complett falsch gelesen - las was von QTreeWidget nicht von QTreeView , sorry.
Verfasst: 12. März 2011 10:19
von upsala
QTableWidgetItem ist nicht von QObject abgeleitet und hat somit auch kein deleteLater().
Verfasst: 13. März 2011 08:15
von forgoden
padreigh hat geschrieben:Hab noch nicht mit dem QTableWidget gearbeitet, aber die API sagt es gibt dort eine Methode
void QTreeWidget::removeItemWidget ( QTreeWidgetItem * item, int column )
und ne Methode die dir sagt wieviele Columns es gibt - eine ganze row zu löschen sollte also trivial sein ...
alternativ:
Du hast eine Liste von QTreeWidgetItems ... das QTableWidgetItem hat childs, es gibt Methoden um zu fragen ob es childs gibt, es gibt Methoden ein einzelnes child zu löschen und Methoden um dir die childs zurückzugeben - sollte nicht schwer sein daraus was zu bauen was funzt wärend du dem ominösen [virtual protected] auf die Spur kommst.
[s]Oder du versuchst einmal ein deleteLater auf einem QTableWidgetItem und schaust was passiert ... k.A.[/s]
Problem ist dass ich nur QTreeView und Model benützte. Unter Model finde ich nur removeRow. Einzelne items entfernen könnte vlt QStandardItemModel::takeItem() sein.
unter virtual verstehe ich nur, dass es zur Laufzeit die methoden wechseln kann. Das macht nur Sinn wenn man Methoden überschreibt. Bisher konnte ich keine Qt Methoden vernünftig überschreiben, wegen den Q_D.
Das eigentliche Problem ist, in QModelIndex ist die Methode "const QAbstractItemModel * QModelIndex::model () const" auf const definiert, somit habe ich überhaupt keinen Zugriff auf die Methoden.
Verfasst: 13. März 2011 08:55
von franzf
1) Es geht hier nicht um das virtual, sondern das protected.
2) Du kannst in einer view nur ein model darstellen, weshalb ein
treeWidget->getSelectedIndex().at(i).model().removeRow(i); absolut nix bringt,
treeWidget->model() reicht vollkommen. Dann ist das model auch nicht const!
3) Der Code aus 2) kompiliert auch deshalb nicht, da item->model() einen Zeiger zurückgibt und keinen Value, weshalb du auf model() nicht mit "." sondern "->" zugreifen musst.
4)
Das macht nur Sinn wenn man Methoden überschreibt. Bisher konnte ich keine Qt Methoden vernünftig überschreiben, wegen den Q_D.
?!? Q_D hat mit einer reimplementierung einer (virtuellen) Funktion einer Basisklasse so viel zu tun wie eine Marmeladenabfüllmaschine mit einem Krapfen. Wo genau hattest du Probleme?
5) Wg. einzelnen Items in einer Zeile entfernen: gehts mit removeColumn?
Kannst du uns auch mal sagen, welches model du in der view anzeigst?
Verfasst: 13. März 2011 09:31
von forgoden
Model wird mit
Code: Alles auswählen
model = new QStandardItemModel;
item = new QStandardItem("Objekte");
model->setHorizontalHeaderItem(0, item);
erzeugt.
erzeugt werden die items z.B.
Code: Alles auswählen
item = new QStandardItem("Objekt_2");
model->setItem(1,0,item);
item = new QStandardItem("Objekt_3");
model->setItem(2,0,item);
item = new QStandardItem("Objekt_4");
item2 = new QStandardItem("Objekt_4_child");
item->setChild(0,0,item2);
model->setItem(3,0,item);
das ganze wird in QTreeView angezeigt.
Wenn ich mehrere ausgewählt habe (Shift oder Strg+mausklick) sollen nur die ausgewählten gelöscht sein. Üblich wie in vielen Programmen.
selectedIndexes müsste die Liste aller ausgewählten Items ausgeben. Ich glaube ich muss so ein Mechanismus bauen, wegen den Childs. Ich dachte man könnte mit pointers gezielt items löschen?
Verfasst: 13. März 2011 09:49
von franzf
Wieso willst du unbedingt auf die protected-Funktion zugreifen? Ein kleiner Blick in die public-section gibt dir ein "selectionModel", über das du sehr einfach auf alles zugreifen kannst (selected columns, rows, indexes).
Und wie kommst du darauf, dass Zeiger immer heißen muss, ein direktes Löschen aus einer Struktur zu ermöglichen?
Verfasst: 13. März 2011 12:41
von padreigh
Eigentlich hast du doch alles was du brauchst?
http://doc.qt.nokia.com/latest/qtreeview.html : gibt dir die selektierten Einträge in Form einer QModelIndexList
QTreeView-API hat geschrieben:QModelIndexList QTreeView::selectedIndexes () const [virtual protected]
Reimplemented from QAbstractItemView::selectedIndexes().
http://doc.qt.nokia.com/latest/qmodelin ... st-typedef : ist nur ein Typedef . in der API sieste ausserdem das es da row und columns gibt die dazu gehören
QModelIndex-API hat geschrieben:
int QModelIndex::row () const
Returns the row this model index refers to.
int QModelIndex::column () const
Returns the column this model index refers to.
http://doc.qt.nokia.com/latest/qstandarditemmodel.html : liefert dir Methoden zum Zeilen/Columns löschen die mit QModelIndexes umgehen können
QStandardItemModel-API hat geschrieben:bool QStandardItemModel::removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ) [virtual]
Reimplemented from QAbstractItemModel::removeColumns().
bool QStandardItemModel::removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() ) [virtual]
Reimplemented from QAbstractItemModel::removeRows().
und
http://doc.qt.nokia.com/latest/qabstractitemmodel.html sagt dir sogar was die Methoden tun :
QAbstractItemModel-API hat geschrieben:bool QAbstractItemModel::removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ) [virtual]
[kannste da nachlesen]
bool QAbstractItemModel::removeRow ( int row, const QModelIndex & parent = QModelIndex() )
[kannste da nachlesen]
Verfasst: 13. März 2011 16:24
von forgoden
ja danke
also mit selectionModel erspare ich mir also den Umweg mit der selbstgeschriebenen Methode getSelectedIndex
gelöst habe ich so:
Code: Alles auswählen
while (treeWidget->selectionModel()->selectedRows().size() != 0)
model->removeRow( treeWidget->selectionModel()->selectedRows().at(0).row(),
treeWidget->selectionModel()->selectedRows().at(0).parent() );
ein bißchen merkwürdig sieht der code schon aus. Funktionieren tut es.
Ich dachte, dass man mit selectionModel oder getSelectedIndexes die Adresse von items rausgeben kann, und der Zeiger z.B. *QAbstractItemModel greift auf diese zu und löscht dann.