Drop in Widget von Datei feststellen

Alles rund um die Programmierung mit Qt
Antworten
Gayson
Beiträge: 16
Registriert: 7. Mai 2006 14:49

Drop in Widget von Datei feststellen

Beitrag von Gayson »

Hallo!

Ich habe ein Widget, welches ich in meinem MainWindow als centralWidget festlege. Durch Drag&Drop von Dateien (z.B. aus dem Windows Explorer) soll die entsprechenden Datei geladen werden - wie krieg ich das hin? Ich muss ja die DragEnterEvent-Methode überschreiben:

Code: Alles auswählen

void SVGWidget::dragEnterEvent ( QDragEnterEvent * event ){
	if (event->mimeData()->hasUrls())
		event->acceptProposedAction();
}
Nur scheint die Überprüfung nicht richtig zu sein - was muss ich prüfen, wenn es nur "lesbare" (Konfigurations-)Dateien sein sollen?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Drop in Widget von Datei feststellen

Beitrag von macman »

The following code shows how dragEnterEvent() can be reimplemented to tell the drag and drop system that we can only handle plain text:

void Window::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("text/plain"))
event->acceptProposedAction();
}
Wenn Du noch genauer prüfen willst, dann den accept nur, wenn der Dateiname einem bestimmten Format entspricht. Du kannst auch die Datei lesen, um die ersten Bytes zu prüfen, usw.
Gayson
Beiträge: 16
Registriert: 7. Mai 2006 14:49

Beitrag von Gayson »

Danke für deine Mühen, hatte vergessen zu erwähnen, dass das bei mir nicht klappt (ich glaub text/plain ist für reinen Text, wenn du den z.B. aus einem Editor dragst).

Bei Dateien muss es wohl über die Urls laufen, da folgender Code klappt (es werden nur Dateien mit Dateinendung .dat erlaubt):

Code: Alles auswählen

	if (event->mimeData()->hasFormat("text/uri-list")){ // oder: event->mimeData()->hasUrls()
		QList<QUrl> urls = event->mimeData()->urls();
		for (int i=0; i<urls.size(); i++)
			if	(!urls.at(i).path().endsWith(".dat", Qt::CaseInsensitive))
				return;
		event->acceptProposedAction();
	}
Trotzdem danke an euch!
Antworten