2017-10-03 20 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データをデコードしてモデルに挿入することで処理されます。 それ以外の場合は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

関連する問題