不同的QTreeWidget 窗口拖拽事件

两个不同的QTreeWidget窗口在相互拖拽的情况下,如何获取鼠标拖拽的item值?

参考GPT和自己的思路:

您可以通过重载QTreeWidget的dragEnterEvent、dragMoveEvent和dropEvent方法,在拖拽事件中获取鼠标拖拽的item值。具体步骤如下:

  1. 在dragEnterEvent和dragMoveEvent中获取拖拽的item:
def dragEnterEvent(self, event):
    mime = event.mimeData()
    if mime.hasFormat("application/x-qabstractitemmodeldatalist"):
        itemData = mime.data("application/x-qabstractitemmodeldatalist")
        stream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
        if stream.atEnd():
            return
        outVariant = QtCore.QVariant()
        stream >> outVariant
        index = self.indexAt(event.pos())
        item = self.itemFromIndex(index)
        print(item.text(0))

def dragMoveEvent(self, event):
    mime = event.mimeData()
    if mime.hasFormat("application/x-qabstractitemmodeldatalist"):
        index = self.indexAt(event.pos())
        item = self.itemFromIndex(index)
        print(item.text(0))
  1. 在dropEvent中获取鼠标拖拽的item并进行操作:
def dropEvent(self, event):
    mime = event.mimeData()
    if mime.hasFormat("application/x-qabstractitemmodeldatalist"):
        itemData = mime.data("application/x-qabstractitemmodeldatalist")
        stream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
        if stream.atEnd():
            return
        outVariant = QtCore.QVariant()
        stream >> outVariant
        index = self.indexAt(event.pos())
        item = self.itemFromIndex(index)
        print(item.text(0))
        
        # 对item进行操作,例如移动或复制到另一个QTreeWidget中

注意,需要在QTreeWidget的setAcceptDrops方法中开启拖拽事件,否则拖拽事件无法触发:

treeWidget1.setAcceptDrops(True)
treeWidget2.setAcceptDrops(True)

https://blog.csdn.net/m0_60259116/article/details/128292528

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您可以利用Qt的拖放系统来实现不同QTreeWidget窗口之间的拖拽事件,并在拖拽事件的过程中获取拖拽的item值。下面是一个简单的示例:

// 定义一个自定义的TreeWidget类,继承自QTreeWidget
class MyTreeWidget : public QTreeWidget
{
public:
    MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent)
    {
        // 设置QTreeWidget接受拖放操作
        setAcceptDrops(true);
        // 设置拖放操作的动作类型
        setDragDropMode(QAbstractItemView::DragDrop);
    }

protected:
    // 重写拖放事件的处理函数
    void dragEnterEvent(QDragEnterEvent *event) override
    {
        // 获取拖放的item
        QTreeWidgetItem *item = currentItem();
        if (item) {
            qDebug() << "dragEnterEvent: " << item->text(0);
        }
        event->acceptProposedAction();
    }

    void dropEvent(QDropEvent *event) override
    {
        // 获取拖放的item
        QTreeWidgetItem *item = currentItem();
        if (item) {
            qDebug() << "dropEvent: " << item->text(0);
        }
        event->acceptProposedAction();
    }
};

// 在主窗口中创建两个自定义的QTreeWidget对象
MyTreeWidget *tree1 = new MyTreeWidget(this);
MyTreeWidget *tree2 = new MyTreeWidget(this);

// 在两个QTreeWidget对象之间进行拖拽操作即可获取拖拽的item值

在上面的代码中,我们定义了一个自定义的MyTreeWidget类,继承自QTreeWidget,并重写了拖放事件的处理函数dragEnterEvent和dropEvent。在这两个函数中,我们通过currentItem()函数获取当前的item,然后通过text(0)获取item的文本值,从而获取拖拽的item值。最后,我们在主窗口中创建两个MyTreeWidget对象,然后在这两个对象之间进行拖拽操作即可获取拖拽的item值。

  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:QTreeWidget详解
  • 你还可以看下qt参考手册中的 qt QTreeWidget
  • 除此之外, 这篇博客: Qt之 QTreeWidget:1 拖拽项目中的 Qt之 QTreeWidget:1 拖拽项目 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • ​ QTreeWidget 的拖拽实现,比较简单,但过程是绕了点路的,按照常规的方法:子类化QTreeWidget、重写 Drag 和 Drop的相关事件、利用QMimeData,QDrag类来实现,功能虽然实现了,但是关闭程序是,有可能会出现异常,类似 指针被二次析构了一样。偶发性的错误,挺让我头疼。

    ​ 牢骚过后,上干货。