Seite 1 von 1
Drag&Drag im TreeWidget
Verfasst: 2. November 2009 16:44
von bob446
Hallo !
ich habe ein TreeWidget und habe darin das Droppen erlaubt. Im dropEvent prüfe ich den Typ des Items, auf das das andere gezogen wurde.
In meinem Fall ein Item aus einem anderen Model:
Code: Alles auswählen
if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
wie kann ich aus dem Event herauslesen, was das Item für einen Namen etc. hat?
Code: Alles auswählen
QByteArray itemData = event->mimeData()->data("application/x-qabstractitemmodeldatalist");
Ich hänge irgendwie grad an der Stelle vielleicht kann mir jemand auf die Sprünge helfen

mfg
Verfasst: 3. November 2009 08:21
von archer
Dum mßt die Daten über einen QDataStream wieder in eien Objekt streamen
Code: Alles auswählen
QDataStream stream(&itemData , QIODevice::ReadOnly);
stream >> myObject;
So in der Art.
Aber Sie dier mal die Dokumentation und die Beispiele an.
Verfasst: 3. November 2009 11:04
von bob446
danke schonmal dafür

ich habe jetzt folgendes geschrieben
Code: Alles auswählen
QByteArray itemData = event->mimeData()->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&itemData , QIODevice::ReadOnly);
QVector<QMap<int, QVariant> > data;
while (!stream.atEnd()) {
int r, c;
QMap<int, QVariant> v;
stream >> r >> c >> v;
data.append(v);
}
for(int a=3;a<data.count();a+=4){
QVariant stItem = data.at(a).value(0);
QString textfromitem = stItem.toString();
}
Damit schaffe ich es, StandardItems einzulesen. Allerdings funktionieren damit alle StandardItems auch welche, die ich nicht unterstützen möchte. Wie kann ich es schaffen, nur bestimmte Items zu erlauben? Ich finde auch meinen Code oben nicht besonders gut, ließe sich der Code noch besser schreiben bzw anders? Vielen Dank für die Hilfe !
edit:
ich habe gerade folgendes gefunden:
Code: Alles auswählen
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-fridgemagnet", itemData);
mimeData->setText(child->labelText());
Kann ich damit meinen eigenen MimeType festlegen und anhand des Typs prüfen ob es sich um mein Objekt handelt, dass ich akzeptieren will?
Verfasst: 3. November 2009 12:06
von archer
Du scheinst kein QTreeWidgetItem zu droppen ist das richtig?
Es gibt flags, die das Droppen steuern können. Ob das in deinem Fall hilft weiß ich nicht.
Hast du dir schon supportedDropActions() angesehen, sowohl in diesem als auch im Anderen Model.?
Verfasst: 4. November 2009 08:49
von bob446
Hallo,
nein es handelt sich bei mir um ein Item in einem Table-Model. Ich habe allerdings herausgefunden, dass ich mithilfe der Methode mimeTypes() meinen eigenen mimeType festlegen kann.
Verfasst: 19. November 2009 20:26
von bob446
Hallo,
ich habe noch ein Problem und zwar möchte ich nur auf bestimmte TreeWidgetItem drops erlauben. Wie kann ich das für einzelne Items einstellen und abstellen? Muss ich das im dragMoveEvent behandeln oder jedem Item mitteilen? Ich habe bereits setFlags(Qt::ItemFlags) probiert allerdings ohne Erfolg. Vllt hat ja schon jemand sowas ähnliches gemacht

Verfasst: 24. November 2009 22:57
von bob446
Hallo,
ich habe jetzt mithilfe von setFlags(Qt::ItemFlags) für einzelne Items das Droppen unterbunden.
Allerdings möchte ich noch das dropen zwischen 2 Items unterbinden.
Code: Alles auswählen
void AbstractItemView::dragMoveEvent(QDragMoveEvent *event)
In dieser Funktion wird anhand der Position das QRect gezeichnet. Allerdings will ich nur DropEvents akzeptieren, welche auf ein Item gezogen wurde:
Code: Alles auswählen
switch(this->dropIndicatorPosition()){
case AboveItem:
{
event->ignore();
break;
}
case BelowItem:
{
event->ignore();
break;
}
case OnItem:
{
QTreeWidget::dragMoveEvent(event);
break;
}
case OnViewport:
{
event->ignore();
break;
}
Allerdings bleibt das ganze hängen sobald ich z.b. auf den Viewport komme(lasse ich mir durch Debugging-Ausgaben anzeigen). Hat jemand eine Ahnung an was das liegen kann?
mfg