Drag&Drop, MousePressEvent

Alles rund um die Programmierung mit Qt
Antworten
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Drag&Drop, MousePressEvent

Beitrag 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...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Du musst Du Events auch weitergeben, wenn Du selbst da nichts mit machst. Das steht in den Beispielen nämlich nicht drin.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

danke! und wie mache ich das? mit event->accept()?
cheers
dontinelli
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: Drag&Drop, MousePressEvent

Beitrag 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;
           }
           
       }
}


.........................
speack português italiano deutsch english castellà qt
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

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