Fragen mit selectedIndex aus QTreeView

Alles rund um die Programmierung mit Qt
Antworten
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Fragen mit selectedIndex aus QTreeView

Beitrag 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.
Win7, VisualStudio 2010, Qt 4.7
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

complett falsch gelesen - las was von QTreeWidget nicht von QTreeView , sorry.
Zuletzt geändert von padreigh am 13. März 2011 12:25, insgesamt 5-mal geändert.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QTableWidgetItem ist nicht von QObject abgeleitet und hat somit auch kein deleteLater().
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag 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.
Zuletzt geändert von forgoden am 13. März 2011 09:11, insgesamt 1-mal geändert.
Win7, VisualStudio 2010, Qt 4.7
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag 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?
Win7, VisualStudio 2010, Qt 4.7
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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]
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag 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.
Win7, VisualStudio 2010, Qt 4.7
Antworten