Login
Newsletter
Werbung

Mo, 16. August 1999, 00:00

KDE-Programmierung: Drag and Drop

In diesem Teil des Workshops werden wir word2html um Drag and Drop-Fähigkeiten erweitern. So soll word2html auch Word-Dateien konvertieren, die anstatt über den Dateiauswahldialog über kfm mit Drag and Drop ausgewählt werden.

Drag and Drop mit KDE

Wir können, wie so oft, auf bereits vorhandenen Code zurückgreifen, so dass wir eigentlich nur noch darauf reagieren müssen, wenn der User eine Datei auf unserem Hauptfenster fallen lässt.

Der Code

Laden Sie einfach die neuen Quellen herunter und überschreiben die alten damit.

/* toplevel.h */
#ifndef _TOPLEVEL_H_
#define _TOPLEVEL_H_
#include <kapp.h>
#include <ktmainwindow.h>
#include <kmenubar.h>
#include <qpopupmenu.h>
#include <qmessagebox.h>
#include <kfiledialog.h>
#include <qmultilinedit.h>
#include <kprocess.h>
#include <qfileinfo.h>
#include <kurl.h>
class TopLevel : public KTMainWindow
{
 Q_OBJECT
public:
 TopLevel();
 void closeEvent(QCloseEvent *);
private slots:
 void aboutApp();
 void openFile();
 void getOutput(KProcess *, char *, int);
 void slotDropEvent(KDNDDropZone *);
private:
 void convert(QString filename);
 QMultiLineEdit *outputDisplay;
 KProcess proc;
};
#endif

Erklärung

 void slotDropEvent(KDNDDropZone *);

Dieser Slot wird ausgeführt, wenn jemand eine Datei auf das Hauptfenster gezogen hat.

 void convert(QString filename);

Der Slot openFile() ist jetzt nur noch für das Anzeigen des Öffnen-Dialogs zuständig. Der Aufruf von mswordview erfolgt jetzt durch void convert(QString filename).

/* toplevel.cpp */
#include "toplevel.h"
TopLevel::TopLevel()
{
 QPopupMenu *file = new QPopupMenu;
 file->insertItem(i18n("Open ..."), this, SLOT(openFile()));
 file->insertSeparator();
 file->insertItem(i18n("&Quit"), kapp, SLOT(quit()));
 QPopupMenu *help = new QPopupMenu;
 help->insertItem(i18n("&About"), this, SLOT(aboutApp()));
 KMenuBar *menu = new KMenuBar(this);
 menu->insertItem(i18n("&File"), file);
 menu->insertSeparator();
 menu->insertItem(i18n("&Help"), help);
 setMenu(menu);
 outputDisplay = new QMultiLineEdit(this);
 outputDisplay->setReadOnly(true);
 setView(outputDisplay);
 connect(&proc, SIGNAL(receivedStdout(KProcess *, char *, int)),
 this, SLOT(getOutput(KProcess *, char *, int)));
 connect(&proc, SIGNAL(receivedStderr(KProcess *, char *, int)),
 this, SLOT(getOutput(KProcess *, char *, int)));
 connect(new KDNDDropZone(this , DndURL),
 SIGNAL(dropAction(KDNDDropZone *)),
 SLOT(slotDropEvent(KDNDDropZone *)));
 resize(500,400);
 setCaption("Word2HTML");
}
void TopLevel::closeEvent(QCloseEvent *)
{
 kapp->quit();
}
void TopLevel::aboutApp()
{
 QMessageBox::about(this, "About Word2HTML","Hello World");
}
void TopLevel::openFile()
{
 QString filename = KFileDialog::getOpenFileName(NULL, "*.doc");
 convert(filename);
}
void TopLevel::getOutput(KProcess *, char *data, int len)
{
 char dst[len+1];
 memmove(dst,data,len);
 dst[len]=0;
 outputDisplay->append(dst);
}
void TopLevel::slotDropEvent(KDNDDropZone *zone)
{
 QString filename = zone->getURLList().first();
 KURL url = filename.data();
 filename = url.path();
 convert(filename);
}
void TopLevel::convert(QString filename)
{
 if (filename == NULL)
 return;
 QFileInfo file(filename);
 if (!file.exists())
 return;
 if (file.isDir())
 return;
 proc << "mswordview";
 proc << filename;
 proc.start(KProcess::NotifyOnExit, KProcess::AllOutput);
}

Erklärung

 connect(new KDNDDropZone(this , DndURL),
 SIGNAL(dropAction(KDNDDropZone *)),
 SLOT(slotDropEvent(KDNDDropZone *)));

Über dem Hauptfenster wird eine DropZone erzeugt. Sie wird mit dem Slot slotDropEvent verbunden, der die Drop-Ereignisse bearbeitet.

 void TopLevel::slotDropEvent(KDNDDropZone *zone)
 {
 QString filename = zone->getURLList().first();

Die URL der auf das Hautpfenster geschobenen Datei wird in der Variable filename gespeichert. Die URL wird nicht einzeln, sondern in einer Stringliste übergeben, da man auch mehrere Dateien gleichzeitig auf das Hauptfenster verschieben kann. Um nicht wie jetzt nur die erste Datei zu konvertieren, müsste man die URLs der Dateien in einer Schleife abfragen und konvertieren.

 KURL url = filename.data();
 filename = url.path();

Wie bereits erwähnt, bekommt man die Dateien als URLs, also in der Form file:/home/user/worddatei.doc. Deshalb wird hier mit Hilfe der Klasse KURL der Pfad extrahiert, weil mswordview mit URLs nichts anfangen kann.

 convert(filename);
 }

Der Pfad der Datei wird nun an die Funktion convert(QString filename) übergeben, die mswordview ausführt und die Datei somit konvertiert.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung