Drag&Drag im TreeWidget

Alles rund um die Programmierung mit Qt
Antworten
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Drag&Drag im TreeWidget

Beitrag 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
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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.
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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.?
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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.
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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 :)
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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
Antworten