繁体   English   中英

将文件拖放到QDialog内部的QTreeWidget中

[英]Drag and drop file into QTreeWidget inside of QDialog

我一直在网上搜索几天,但找不到任何可以帮助解决我的特定问题的信息。 我试图设置此对话框以接受要拖放到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();
 }

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

布尔QTreeWidget :: dropMimeData(QTreeWidgetItem * parent,int index,const QMimeData * data,Qt :: DropAction操作)

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

如果通过解码mime数据并将其插入模型成功处理了drop,则默认实现将返回true;否则,默认实现为true。 否则返回false。

QStringList QTreeWidget :: mimeTypes()常量

返回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

完整的示例可以在以下链接中找到。 如果您已经有Qt Designer分配的QTreeWidget,则最简单的解决方案是将Qt Designer QTreeWidget升级为使用新类。

输出:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM