[英]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
继承的类,并且必须实现以下受保护的方法:
处理通过拖放操作提供的数据,该操作以给定父项的索引中的给定操作结束。
如果通过解码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.