将文件拖放到QDialog内的QTreeWidget中

时间:2017-10-03 18:49:27

标签: c++ qt qt5 qtreewidget qtreewidgetitem

我已经在网上搜索了几天,我无法找到任何可以解决我的具体问题。我尝试设置此对话框以接受要放入QTreeWidget的文件,名为filesTreeWidget,但我在网上搜索的所有内容似乎都没有什么区别。我对QT和C ++也很陌生,所以我确信这对你没有帮助。 谢谢你的帮助

标题

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();
 }

1 个答案:

答案 0 :(得分:2)

首先,正确的做法是在QTreeWidget内实施拖放,而不是在QDialog内。为此,我们必须创建一个继承自QTreeWidget的类,并且我们必须实现以下受保护的方法:

  

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

     

处理以结束的拖放操作提供的数据   给定父项中索引中的给定操作。

     

如果成功删除,则默认实现返回true   通过解码哑剧数据并将其插入模型来处理;   否则返回false。

     

QStringList QTreeWidget::mimeTypes() const

     

返回可用于描述列表的MIME类型列表   treewidget项目。

     

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