【问题标题】:Drag and drop file into QTreeWidget inside of QDialog将文件拖放到 QDialog 内的 QTreeWidget 中
【发布时间】:2018-03-15 01:19:32
【问题描述】:

我已经在网上搜索了几天,但找不到任何可以帮助解决我的具体问题的东西。我正在尝试设置此对话框以接受要放入 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();
 }

【问题讨论】:

  • 将元素拖到哪里?
  • 我想将文件拖到一个名为 filesTreeWidget 的 QTreeWidget 中,它位于 FileIQ Dialog ui->filesTreeWidget
  • 您想在 qtreewidget 中显示什么?文件名?
  • 是的,就是这样
  • 您希望将它放在 QtreeWidget 的哪个部分?

标签: c++ qt qt5 qtreewidget qtreewidgetitem


【解决方案1】:

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

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

处理由拖放操作提供的数据,该操作以 给定父项的索引中的给定动作。

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

QStringList QTreeWidget::mimeTypes() const

返回可用于描述的 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 使用新类。

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2021-08-07
    • 2011-12-21
    • 2011-08-05
    相关资源
    最近更新 更多