QT中实现从桌面拖拽QTreeWidget上显示

在公司写完一些关于QTreeWidget的功能之后,突然告知要做一个拖拽的功能。
网上查了一下,大概需要这样做:

1.重写QTreeWidget类

2.重写类中的三个函数

void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);

3.将重写后的QTreeWidget类做“提升为”,如图
在这里插入图片描述
输入“提升的类名称”后
在这里插入图片描述
提升完毕

下面是三个函数的具体实现

void MyQTreeWidget::dragEnterEvent(QDragEnterEvent *event)
{
    //qDebug()<<"dragEnterEvent";
    if (event->mimeData()->hasFormat("text/uri-list"))
        event->acceptProposedAction();
}

void MyQTreeWidget::dragMoveEvent(QDragMoveEvent *event)
{
    //qDebug()<<"dragMoveEvent";
}

void MyQTreeWidget::dropEvent(QDropEvent *event)
{
    //qDebug()<<"dropEvent";
    QList<QUrl> urls = event->mimeData()->urls();

    if(urls.isEmpty())
    {
        qDebug()<<"drop url empty";
        return;
    }

    foreach(QUrl url, urls)
    {
        //do something
    }
}

这样一来就完事啦

需要注意的几点:
1.如果没有必要,dragMoveEvent可以不用重写
2.如果要改主窗口的东西,可以在foreach里把 url 当成信号 emit 出去,然后再在主窗口里写槽函数接收
3.可以注意到我是用 QList urls 来接收的,所以这个是可以多选拖拽的
4. url.toLocalFile() 返回文件(夹)绝对路径,url.fileName() 返回文件(夹)名

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤实现QTableWidget的数据拖动QTreeWidget上: 1.启用QTableWidget的拖放功能,设置setDragEnabled(True)。 2.在QTableWidget设置所需的MIME类型,以便在拖动时传递数据。可以使用setMimeTypes()方法设置MIME类型。 3.在QTableWidget实现dragEvent()方法,以便在拖动时设置拖动数据的MIME类型和数据。 4.在QTreeWidget实现dropEvent()方法,以便在放置时获取拖动数据并将其添加到QTreeWidget。 下面是一个示例代码,演示如何将QTableWidget的数据拖动QTreeWidget上: ```python from PyQt5.QtWidgets import QApplication, QTableWidget, QTreeWidgetItem, QTreeWidget, QWidget, QVBoxLayout from PyQt5.QtCore import Qt, QMimeData from PyQt5.QtGui import QDrag class TableWidget(QTableWidget): def __init__(self, parent=None): super().__init__(parent) self.setDragEnabled(True) self.setRowCount(4) self.setColumnCount(2) self.setItem(0, 0, QTableWidgetItem("Item 1")) self.setItem(0, 1, QTableWidgetItem("Value 1")) self.setItem(1, 0, QTableWidgetItem("Item 2")) self.setItem(1, 1, QTableWidgetItem("Value 2")) self.setItem(2, 0, QTableWidgetItem("Item 3")) self.setItem(2, 1, QTableWidgetItem("Value 3")) self.setItem(3, 0, QTableWidgetItem("Item 4")) self.setItem(3, 1, QTableWidgetItem("Value 4")) self.setMimeTypes(["text/plain"]) def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton: mimeData = QMimeData() item = self.itemAt(event.pos()) if item is not None: mimeData.setText(item.text()) drag = QDrag(self) drag.setMimeData(mimeData) drag.exec_(Qt.MoveAction) class TreeWidget(QTreeWidget): def __init__(self, parent=None): super().__init__(parent) self.setAcceptDrops(True) def dropEvent(self, event): if event.mimeData().hasText(): item = QTreeWidgetItem(self) item.setText(0, event.mimeData().text()) class Widget(QWidget): def __init__(self, parent=None): super().__init__(parent) layout = QVBoxLayout(self) self.tableWidget = TableWidget(self) self.treeWidget = TreeWidget(self) layout.addWidget(self.tableWidget) layout.addWidget(self.treeWidget) if __name__ == '__main__': app = QApplication([]) widget = Widget() widget.show() app.exec_() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值