两个不同的QTreeWidget窗口在相互拖拽的情况下,如何获取鼠标拖拽的item值?
参考GPT和自己的思路:
您可以通过重载QTreeWidget的dragEnterEvent、dragMoveEvent和dropEvent方法,在拖拽事件中获取鼠标拖拽的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))
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 的拖拽实现,比较简单,但过程是绕了点路的,按照常规的方法:子类化QTreeWidget、重写 Drag 和 Drop的相关事件、利用QMimeData,QDrag类来实现,功能虽然实现了,但是关闭程序是,有可能会出现异常,类似 指针被二次析构了一样。偶发性的错误,挺让我头疼。
牢骚过后,上干货。