我已经在网上搜索了几天,我无法找到任何可以解决我的具体问题。我尝试设置此对话框以接受要放入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();
}
答案 0 :(得分:2)
首先,正确的做法是在QTreeWidget
内实施拖放,而不是在QDialog
内。为此,我们必须创建一个继承自QTreeWidget
的类,并且我们必须实现以下受保护的方法:
处理以结束的拖放操作提供的数据 给定父项中索引中的给定操作。
如果成功删除,则默认实现返回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使用新类。
输出: