2017-10-03 29 views
0

나는 온라인으로 검색을 해왔으며, 특정 문제를 해결할 수있는 것을 찾지 못했습니다. filesTreeWidget이라는 이름의 QTreeWidget에 파일을 가져올 수 있도록이 대화 상자를 설정하려고합니다.하지만 온라인으로 검색 한 모든 것이 차이를 만드는 것처럼 보이지 않습니다. 저는 QT와 C++에 대해 꽤 새로운 것입니다. 그래서 도움이되지 않을 것이라고 확신합니다. 어떤 도움QDialog의 QTreeWidget에 파일을 끌어다 놓기

헤더

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

은 어디 요소를 끌어합니까? – eyllanesc

+0

FileIQ 대화 상자에있는 filesTreeWidget이라는 QTreeWidget에 파일을 드래그하고자합니다. ui-> filesTreeWidget –

+0

그리고 qtreewidget에 표시 할 내용을 무엇입니까? 파일 이름? – eyllanesc

답변

2

첫째위한 덕분에, 옳은 일 드래그를 구현하고, QTreeWidget 내에 있지 내부 QDialog을 드롭하는 것입니다. 이를 위해 우리는 QTreeWidget에서 상속하는 클래스를 작성해야하고 우리는 다음과 같은 보호 방법을 구현해야합니다

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

는 드래그가 제공 한 데이터를 처리하고 주어진 행동으로 종료 드롭 조작 지정된 친 항목의 인덱스

기본 구현은 삭제가 성공적으로 수행 된 경우 이 mime 데이터를 디코딩하여 모델에 삽입하여 처리하는 경우 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

QStringList QTreeWidget::mimeTypes() const

는 treewidget 항목의 목록을 설명하는 데 사용할 수있는 MIME 타입의리스트를 돌려줍니다.

Qt::DropActions QTreeWidget::supportedDropActions() const

이 뷰가 지원하는 드롭 액션을 돌려줍니다.

#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 

완전한 예를

다음 link에서 찾을 수 있습니다 우리가이 클래스를 구현 위에서

. 이미 Qt Designer에서 QTreeWidget을 할당 한 경우 가장 간단한 해결책은 promote the Qt Designer QTreeWidget에서 새 클래스를 사용하는 것입니다.

는 출력 :

enter image description here

+0

+. 많은 사람들이 당신의 모범을 보여 주셔서 감사합니다. – Taz742