Seite 1 von 1

Drag&Drop, MousePressEvent

Verfasst: 9. Mai 2007 17:21
von dontinelli
Hallo zusammen

Ich möchte einen kleinen FTP-Client erstellen, wobei die Dateien per Drag and Drop hoch- respektive runtergeladen werden sollten. Nun habe ich aber bei der Implementierung einige Probleme.

Ich habe ein eigenes Widget, welches aus zwei von QListWidget abgeleiteten Klassen besteht (je eines für die Ordner und eines für die Dateien), erstellt.
In den Listen-Klassen habe ich unter protected die verschiedenen Events deklariert und die Funktionen analog dem Qt-Beispiel gefüllt.

Nun werden aber die Klicks nicht mehr richtig ausgeführt. Per klicken kann kein anderes Item ausgewählt werden, die Navigation mit den Pfeilen, das Scrollen sowie das fokusieren klappt einwandfrei.

In der Doku habe ich gelesen, dass unter Umständen der ReleaseEvent nicht richtig ausgelöst wird. Könnte es daran liegen, auch wenn ich in der Funktion kein Widget erstelle? Wird dadurch auch der Klick beeinträchtigt? Und wie kann man das beheben? Das steht nämlich in der Doku nicht...

Liebe Grüsse
Don Tinelli

PS Per Debug habe ich herausgefunden, dass der Press- und der Release-Event funktionieren...

Verfasst: 10. Mai 2007 07:22
von macman
Du musst Du Events auch weitergeben, wenn Du selbst da nichts mit machst. Das steht in den Beispielen nämlich nicht drin.

Verfasst: 10. Mai 2007 15:08
von dontinelli
danke! und wie mache ich das? mit event->accept()?
cheers
dontinelli

Verfasst: 10. Mai 2007 15:28
von macman
dontinelli hat geschrieben:danke! und wie mache ich das? mit event->accept()?
Nein. Um bei dem Beispiel zu bleiben:

Code: Alles auswählen

 void MainWindow::mousePressEvent(QMouseEvent *event)
 {
     if (event->button() == Qt::LeftButton
         && iconLabel->geometry().contains(event->pos())) {

         QDrag *drag = new QDrag(this);
         QMimeData *mimeData = new QMimeData;

         mimeData->setText(commentEdit->toPlainText());
         drag->setMimeData(mimeData);
         drag->setPixmap(iconPixmap);

         Qt::DropAction dropAction = drag->start();
         ...
     }
 }
Da fehlt ein QMainWindow::mousePressEvent(event);, damit andere Klicks, die nicht in die if-Abfrage laufen, auch abgearbeitet werden.

Re: Drag&Drop, MousePressEvent

Verfasst: 10. Mai 2007 15:57
von patrik08
dontinelli hat geschrieben:Hallo zusammen

Ich möchte einen kleinen FTP-Client erstellen, wobei die Dateien per Drag and Drop hoch- respektive runtergeladen der Doku habe ich gelesen, dass unter Umständen der ReleaseEvent nicht richtig ausgelöst wird. Könnte es daran liegen, auch wenn ich in der Funktion kei

PS Per Debug habe ich herausgefunden, dass der Press- und der Release-Event funktionieren...
Das raufladen geht prima auch dir rekursive....
das runter draggen auf direkt desktop oder so ist nicht einfach ....
was geht ein lokales QDirmodel und das tree remote ( beide beinander) dann kann man runter draggen...

aus https://qt-webdav.svn.sourceforge.net/s ... v_main.cpp

ist zwar nicht ftp aber webdav ist fast identisch ausser den port!

Beim Window Drag hinein in einen tree muss man ein timer machen dass etwa 200 millisekunden wartet bis der herr richtig in der tmp schreibt!.


probiere http://sourceforge.net/project/showfile ... _id=222560
zu builden ... bis heute kann man dass auf alle 3 haupt os compilieren....

bei http://www.mydocsonline.com/ kann man dann free testen... oder du hast selber ein apache2....

Code: Alles auswählen


void Dav_Main::dragEnterEvent(QDragEnterEvent *event)
{
  event->acceptProposedAction();
}

void Dav_Main::dropEvent(QDropEvent *event)
{

if (!netopen) {
    /* andere zyklus offen upload oder download... */
    return;
}

     OnCodadir.clear();
     OnCodafile.clear();
    
    if(event && event->mimeData()) {
        const QMimeData *data = event->mimeData();
        QStringList urlmixed;
        urlmixed.clear();
        QStringList dirmixed;
        dirmixed.clear();
        QList<QUrl> urlelist;
           if (data->hasUrls()) {
                  urlelist = data->urls(); 
               for ( int i = 0; i < urlelist.size(); ++i ) { 
                  QUrl gettyurl(urlelist.at(i));
                     if (gettyurl.isValid()) {
                         QString shema = gettyurl.scheme();
                               ////////////qDebug() << "### shema " << shema; 
                         if (shema == "file") {
                             QString localfileupsgo = gettyurl.toLocalFile();
                             
                             if (is_file(localfileupsgo)) {
                             urlmixed.append(localfileupsgo);  
                                 qDebug() << "### file " << localfileupsgo;
                             }
                               QDir diro(localfileupsgo);
                               if (diro.exists()) {
                                dirmixed.append(localfileupsgo);
                                   qDebug() << "### dirs " << localfileupsgo;
                               }
                         }
                      }
               }
               SendUpPutList(urlmixed,dirmixed);  /* upload liste file & dir zuerst die dir um die ordner bereit zu haben... */
               return;
           }
           
       }
}



Verfasst: 11. Mai 2007 15:33
von dontinelli
Da fehlt ein QMainWindow::mousePressEvent(event);, damit andere Klicks, die nicht in die if-Abfrage laufen, auch abgearbeitet werden.
Genau das wars. Vielen Dank!!!

Cheers
Don Tinelli