2017-10-03 8 views
0

Ich habe seit Tagen online gesucht und ich kann nichts finden, um mit meinem spezifischen Problem zu helfen. Ich versuche, diesen Dialog einzurichten, um Dateien zu akzeptieren, die in das QTreeWidget namens filesTreeWidget fallen, aber alles, was ich online gesucht habe, scheint keinen Unterschied zu machen. Ich bin auch ziemlich neu in QT und C++, also bin ich mir sicher, dass das nicht hilft. Danke für jede HilfeDrag & Drop-Datei in QTreeWidget innerhalb von QDialog

Kopf

class FileIQ : public QDialog 
{ 
    Q_OBJECT 

protected: 
    void dropEvent(QDropEvent *event); 
    void dragEnterEvent(QDragEnterEvent *event); 
    void dragMoveEvent(QDragMoveEvent *event); 
    void dragLeaveEvent(QDragLeaveEvent *event); 
} 

Cpp

FileIQ::FileIQ(QWidget *parent, DR::EnginePtr engine) 
: QDialog(parent) 
, ui(new Ui::FileIQ) 
, engine_(engine) 
{ 
    ui->filesTreeWidget->setAcceptDrops(true); 
    ui->filesTreeWidget->setDropIndicatorShown(true); 
    setAcceptDrops(true); 
} 

void FileIQ::dropEvent(QDropEvent *event) 
{ 
    foreach(const QUrl &url, event->mimeData()->urls()) { 
     QString filename = url.toLocalFile(); 
     qDebug() << "Dropped file:" << filename; 
     QTreeWidgetItem *item = new QTreeWidgetItem(ui->filesTreeWidget); 
     item->setText(0, filename); 
    } 

} 


void FileIQ::dragEnterEvent(QDragEnterEvent *event) 
{ 
    event->accept(); 
} 

void FileIQ::dragMoveEvent(QDragMoveEvent * event) 
{ 
    event->accept(); 
} 

void FileIQ::dragLeaveEvent(QDragLeaveEvent * event) 
{ 
    event->accept(); 
} 
+0

Wo ziehen Sie die Elemente? – eyllanesc

+0

Ich möchte die Dateien in ein QTreeWidget mit dem Namen filesTreeWidget ziehen, das sich im FileIQ Dialog befindet. ui-> filesTreeWidget –

+0

Und was möchten Sie im qtreewidget anzeigen? Der Name der Dateien? – eyllanesc

Antwort

2

Zuerst das Richtige ziehen zu implementieren und innerhalb QTreeWidget fallen, nicht in QDialog. Dazu müssen wir eine Klasse erstellen, die von QTreeWidget erbt, und wir müssen die folgenden geschützten Methoden implementieren:

bool QTreeWidget::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action)

die Daten Griffe durch einen Drag geliefert und Drop-Operation, die mit beendet die gegebene Aktion in der Index im angegebenen übergeordneten Element.

Die Standardimplementierung gibt "true" zurück, wenn die Löschung erfolgreich durchgeführt wurde , indem die MIME-Daten entschlüsselt und in das Modell eingefügt wurden; andernfalls gibt es false zurück.

QStringList QTreeWidget::mimeTypes() const

Gibt eine Liste von MIME-Typen, die verwendet werden können, um eine Liste von treewidget Artikel zu beschreiben.

Qt::DropActions QTreeWidget::supportedDropActions() const

Gibt die Drop-Aktionen werden von dieser Ansicht unterstützt.

Aus der obigen wir diese Klasse implementiert:

#ifndef TREEWIDGET_H 
#define TREEWIDGET_H 

#include <QDropEvent> 
#include <QTreeWidget> 
#include <QMimeData> 
#include <QFileInfo> 

class FilesTreeWidget : public QTreeWidget 
{ 
    Q_OBJECT 
public: 
    FilesTreeWidget(QWidget *parent= Q_NULLPTR): 
     QTreeWidget(parent) 
    { 
     setAcceptDrops(true); 
     setDropIndicatorShown(true); 
     setColumnCount(2); 
    } 

protected: 
    bool dropMimeData(QTreeWidgetItem *parent, int /*index*/, const QMimeData *data, Qt::DropAction /*action*/) 
    { 

     for(const QUrl url: data->urls()) { 
      const QFileInfo info(url.toLocalFile()); 
      if(info.isFile()){ 
       QTreeWidgetItem *item; 
       if (parent){ 
        item = new QTreeWidgetItem(parent); 
        parent->setExpanded(true); 
       } 
       else 
        item = new QTreeWidgetItem(this); 
       item->setText(0, info.fileName()); 
       item->setText(1, info.filePath()); 
      } 
     } 
     return true; 
    } 

    QStringList mimeTypes() const 
    { 
     return QStringList()<<"text/uri-list"; 
    } 

    Qt::DropActions supportedDropActions() const 
    { 
     return Qt::CopyAction; 
    } 

}; 

#endif // TREEWIDGET_H 

Das vollständige Beispiel finden Sie im folgenden link finden. Wenn Sie bereits ein QTreeWidget von Qt Designer zugewiesen bekommen haben, ist die einfachste Lösung promote the Qt Designer QTreeWidget, um die neue Klasse zu verwenden.

Ausgang:

enter image description here

+0

+. Vielen Dank für Ihre Beispiele, guter Job Mann. – Taz742