C++ 如何获取拖动的源&;QTreeWidget中的drop操作
(对不起我的英语) 我目前正在尝试在QTreeWidget中进行拖放。因此,我将相应的设置和方法放置在dropEvent中:C++ 如何获取拖动的源&;QTreeWidget中的drop操作,c++,qt,drag,treewidget,C++,Qt,Drag,Treewidget,(对不起我的英语) 我目前正在尝试在QTreeWidget中进行拖放。因此,我将相应的设置和方法放置在dropEvent中: class TreeWidget : public QTreeWidget { protected: virtual void dropEvent(QDropEvent *event) override { QModelIndex index = indexAt(event->pos()); if (!index.isValid()) {
class TreeWidget : public QTreeWidget
{
protected:
virtual void dropEvent(QDropEvent *event) override
{
QModelIndex index = indexAt(event->pos());
if (!index.isValid()) { // just in case
event->setDropAction(Qt::IgnoreAction);
return;
}
QTreeWidgetItem* item = itemFromIndex(index);
qDebug() << "drop on item" << item->text(0);
QTreeWidget::dropEvent(event);
}
};
int main()
{
TreeWidget *listWidget = new TreeWidget;
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
listWidget->setDragEnabled(true);
listWidget->viewport()->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->setDragDropMode(QAbstractItemView::InternalMove);
}
classtreewidget:publicqtreewidget
{
受保护的:
虚拟void dropEvent(QDropEvent*事件)重写
{
QModelIndex index=indexAt(事件->位置());
如果(!index.isValid()){//以防万一
事件->setDropAction(Qt::IgnoreAction);
返回;
}
QTreeWidgetItem*item=itemFromIndex(索引);
qDebug()setSelectionMode(QAbstractItemView::SingleSelection);
listWidget->setDragEnabled(真);
listWidget->viewport()->setAcceptDrops(真);
listWidget->setDropIndicatorShown(真);
listWidget->setDragDropMode(QAbstractItemView::InternalMove);
}
但在我的例子中,我只想移动父项。在代码中,我得到了目标项,但是如何得到拖动项
我必须重载拖动方法吗?从mousePressEvent启动拖动?最好的方法是什么
谢谢!您可以通过以下方式获得拖动的项目: 如果拖动操作的源是此应用程序中的小部件, 此函数返回该源;否则返回0 之后,您可以尝试使用将其转换为更特定的Qt类,即
QTreeWidget
。如果对象不是从请求的类派生的,则将返回0
:
如果对象类型为T(或),则将给定对象强制转换为T类型
否则返回0。如果对象为0,则它也将
返回0
不幸的是,QTreeWidget项不是从QObject派生的。我们建议使用QTreeWidget::currentItem()获取移动的元素。它不使用QDropent参数,但似乎可以工作。
QObject
source是一个QTreeWidget
。因此,您可以从源QTreeWidget
@Maluna34请求currentItem
,您应该以任何方式检查源代码。否则,您可以接受来自任何源代码的drop事件它将作为您的树的移动项目!