[gelöst] 2 Fragen zu Drag & Drop
Verfasst: 26. Februar 2010 13:25
Hallo zusammen,
ich weiß, dass es hier schon genug Fragen zu DnD gibt und die Doku auch einiges ausspukt, doch leider bringt mich weder das eine noch das andere wirklich weiter, darum der neue Thread...
Also:
Ich hab ein QTreeWidget, welches ich mittlerweile "gesubclassed" (kann mir bitte irgendwer ein ordentlich Wort hierfür sagen?) habe und ein paar Methoden überschreibe (ua. dropEvent, ...).
Prinzipiell funktioniert das ganze mit der Standard-DnD-Funktionalität ganz gut, allerdings benötige ich 2 "Zusatzfunktionen".
1.)
Gewisse Elemente dürfen nur als Nodes fungieren (sie dürfen keine Parents werden, dh. sie dürfen keine Unterelemente bekommen).
Das hab ich gelöst, indem ich einfach bei der Item-Erstellung die Flags händisch setze und das ItemIsDropEnabled-Flag weglassen:
Funktioniert soweit auch wie es soll. Was ich allerdings noch bräuchte:
Diese Items dürfen kein "Root"-Item werden, dh. sie MÜSSEN ein Parent-Item besitzen (gehören immer in eine bestimmte Kategorie)!
Wie könnte ich das erreichen?
Wenn es einfacher wäre könnte ich mir auch vorstellen, dass gar kein Item per DnD auf Root-Ebene verschoben werden darf!
2.)
Nachdem Item(s) gedropped wurden, soll mein TreeWidget ein Signal schicken. Dieses Signal soll 2 Dinge beinhalten:
Gedroppte Items (kein Problem), Target-Item (also jenes Item, in welches verschoben wurde).
Wie komme ich an das Target-Item? Sofern ich die Doku richtig verstehe gibt es hierzu keine Hilfe außer die Mausposition beim Drop. Richtig?
Wenn ja, wie komme ich dann von der Mauspos an mein Tree-Item? Vorhanden wäre ja die ItemAt-Methode des TreeWidgets. Leider bringt mir das recht wenig. Warum, erkläre ich am besten mit 2 Beispielen:
Ich hab in meinem überschriebenen DropEvent mal eingebaut, dass der Text vom Item, dass ich über ItemAt erhalte, ausgegeben wird:
Beispiel 1:

"Frage 5" wird zwischen "Unterkategorie 1" & "Unterkategorie 2" abgelegt.
Als "Target-Item" sollte mein Signal also "Hauptkategorie" schicken.
Der Source-Code oben gibt aber "Unterkategorie 1" aus (ist ja soweit auch richtig, da ich ja mit ItemAt(Mousepos) abfrage...).
Beispiel 2:

"Frage 5" wird quasi neben "Hauptkategorie" abgelegt -> "Frage 5" wird selbst zu einem "Root"-Item.
Genau das möchte ich eigentlich komplett verhindern (siehe Punkt 1.).
Das über ItemAt ermittelte Item ist natürlich "Hauptkategorie". Also auch wieder korrektes Verhalten, aber nicht das, was ich erreichen möchte...
Ich hoffe, dass sich jemand die Mühe antut und mir hier ein wenig weiterhilft!
danke, mfg
ps.: Bei der ganzen Geschichte geht es ausschließlich um das verschieben von Items innerhalb meines TreeWidgets. Also nur InternalMove!
ich weiß, dass es hier schon genug Fragen zu DnD gibt und die Doku auch einiges ausspukt, doch leider bringt mich weder das eine noch das andere wirklich weiter, darum der neue Thread...
Also:
Ich hab ein QTreeWidget, welches ich mittlerweile "gesubclassed" (kann mir bitte irgendwer ein ordentlich Wort hierfür sagen?) habe und ein paar Methoden überschreibe (ua. dropEvent, ...).
Prinzipiell funktioniert das ganze mit der Standard-DnD-Funktionalität ganz gut, allerdings benötige ich 2 "Zusatzfunktionen".
1.)
Gewisse Elemente dürfen nur als Nodes fungieren (sie dürfen keine Parents werden, dh. sie dürfen keine Unterelemente bekommen).
Das hab ich gelöst, indem ich einfach bei der Item-Erstellung die Flags händisch setze und das ItemIsDropEnabled-Flag weglassen:
Code: Alles auswählen
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);Diese Items dürfen kein "Root"-Item werden, dh. sie MÜSSEN ein Parent-Item besitzen (gehören immer in eine bestimmte Kategorie)!
Wie könnte ich das erreichen?
Wenn es einfacher wäre könnte ich mir auch vorstellen, dass gar kein Item per DnD auf Root-Ebene verschoben werden darf!
2.)
Nachdem Item(s) gedropped wurden, soll mein TreeWidget ein Signal schicken. Dieses Signal soll 2 Dinge beinhalten:
Gedroppte Items (kein Problem), Target-Item (also jenes Item, in welches verschoben wurde).
Wie komme ich an das Target-Item? Sofern ich die Doku richtig verstehe gibt es hierzu keine Hilfe außer die Mausposition beim Drop. Richtig?
Wenn ja, wie komme ich dann von der Mauspos an mein Tree-Item? Vorhanden wäre ja die ItemAt-Methode des TreeWidgets. Leider bringt mir das recht wenig. Warum, erkläre ich am besten mit 2 Beispielen:
Ich hab in meinem überschriebenen DropEvent mal eingebaut, dass der Text vom Item, dass ich über ItemAt erhalte, ausgegeben wird:
Code: Alles auswählen
void QEditDatabaseTreeWidget::dropEvent(QDropEvent *event)
{
QTreeWidgetItem *pItem = this->itemAt(event->pos());
if (pItem)
{
qDebug() << pItem->text(0);
}
else
qDebug() << "Drop to no Item!";
//...
QTreeWidget::dropEvent(event);
}

"Frage 5" wird zwischen "Unterkategorie 1" & "Unterkategorie 2" abgelegt.
Als "Target-Item" sollte mein Signal also "Hauptkategorie" schicken.
Der Source-Code oben gibt aber "Unterkategorie 1" aus (ist ja soweit auch richtig, da ich ja mit ItemAt(Mousepos) abfrage...).
Beispiel 2:

"Frage 5" wird quasi neben "Hauptkategorie" abgelegt -> "Frage 5" wird selbst zu einem "Root"-Item.
Genau das möchte ich eigentlich komplett verhindern (siehe Punkt 1.).
Das über ItemAt ermittelte Item ist natürlich "Hauptkategorie". Also auch wieder korrektes Verhalten, aber nicht das, was ich erreichen möchte...
Ich hoffe, dass sich jemand die Mühe antut und mir hier ein wenig weiterhilft!
danke, mfg
ps.: Bei der ganzen Geschichte geht es ausschließlich um das verschieben von Items innerhalb meines TreeWidgets. Also nur InternalMove!