Drag & Drop mit ItemModel

Alles rund um die Programmierung mit Qt
Antworten
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Drag & Drop mit ItemModel

Beitrag von ArneStocker »

Hi

gibt es irgendwelche Umstände, die man beim Drag&Drop zwischen verschiedenen Applikationen beachten muss. Ich verwende den Drag&Drop Mechanismus des QAbstractItemModel und innerhalb meiner Applikation sowie zwischen zwei (gleichen) Applikationen funktioniert es wunderbar (testweise mit Mimetyp 'text/plain').

Ich kann auch den Text wunderbar von meiner Applikation in einen Texteditor ziehen, nur umgekehrt nicht.

MyApp1 -> MyApp1 [ok]
MyApp1 -> MyApp2 [ok]
MyApp1 -> TextEditor [ok]
TextEditor -> MyApp1 [not ok]

Es wird nicht einmal ein DragEnterEvent ausgelöst und über dem Fenster (View) befindet sich lediglich ein Kreis mit Balken.

Code: Alles auswählen


        ... m_mime_types.add("text/plain");
        ... m_mime_types.add("text/xml");
        ... this.m_view.setDragDropMode(QAbstractItemView.DragDropMode.DragDrop);
        ... this.m_view.setDragEnabled(true);
	... this.m_view.setAcceptDrops(true);
	... this.m_view.viewport().setAcceptDrops(true);
	
	public boolean dropMimeData(QMimeData mimedata, DropAction dropaction, int arg2, int arg3, QModelIndex parent) {
		if (dropaction == Qt.DropAction.IgnoreAction) {
			return false;
		}
		Iterator<String> format_it = mimedata.formats().iterator();
		while (format_it.hasNext()) {
			String format = format_it.next();
			if (this.m_mime_types.contains(format)) {
				System.out.println("Drop: " + format);
				return true;
			}
		}
        return false;
	}

	
	public QMimeData mimeData(List<QModelIndex> modelindex_list) {
		if ((modelindex_list != null) && (modelindex_list.size() > 0) && (this.m_mime_drag) ) {
			QMimeData mimedata = new QMimeData();
			QModelInfo modelinfo = this.IndexToInfo(modelindex_list.get(0));
			String xml_data = modelinfo.GetDatenText(object_get.mime_text);
			QByteArray bytearray = new QByteArray(xml_data);
			mimedata.setData("text/plain", bytearray);
			mimedata.setData("text/xml",bytearray);
			return mimedata;
		}
		else {
			return super.mimeData(modelindex_list);
		}
	}

	public List<String> mimeTypes() {
		return this.m_mime_types;
	}
gruss Arne
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

In den Qt-Examples ist eine nette Testanwendung.

Code: Alles auswählen

\examples\draganddrop\dropsite
Damit könntest du mal schauen was Dein TextEditor so alles überträgt.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Leider enthält das qtjambi framework nicht dieses Beispiel. Ich muss mir hier erst mal wieder eine c++ ide aufsetzen.

Was mich aber stutzig macht, dass ich von 'Fremdapplikationen' nicht einmal ein DragEvent erhalten, wohl aber wenn die 'Fremdapplikation' eine weitere Instanz meines Programms ist. Das DragEvent (für den View) sollte aber in jedem Falle aufgerufen werden unabhängig davon, welcher mimetyp übermittelt wird (oder sehe ich da etwas falsch)

Gruß Arne
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hallo,

also in meinen Anwendungen nutze ich häufig Drag&Drop mit Fremdapplikationen auf der Basis von text/plain.
Alle Events kommen so wie sie kommen sollten.
Eventuell haben wir es hier mit einem speziellen Problem von QtJambi zu tun?

Das Example macht nichts anderes als alle empfangenen MimeTypes und deren "Inhalt" aufzulisten.

Ciao,
Sephral
Antworten