如何获得QTreeWidget内部项目移动的通知
How can I get notified of internal item moves inside a QTreeWidget?
我对QTreeWidget进行了子类化,将其dragDropMode设置为InternalMove,并用自定义项填充它,其中一些项可以拖动,另一些项接受拖放。用户可以按预期在树中移动项目。但我需要得到项目顺序变化的通知,并做出适当的反应。不幸的是,没有与树内项目移动相关的信号,我可以连接到
我尝试获取QTreeWidget的底层模型()的句柄,然后连接到它的rowsMoved信号,但它似乎不会在内部移动时发出。
我重新实现了QTreeWidget的dropEvent(),但无法确定那里的目标行索引。
显然,内部移动根本不会调用dropMimeData()事件。
我还能尝试其他方法吗?谢谢
在重新实现的dropEvent()
中,您应该能够找到目标行索引和项:
void
subclass::dropEvent(QDropEvent* event)
{
QModelIndex index = indexAt(event->pos());
if (!index.isValid()) { // just in case
event->setDropAction(Qt::IgnoreAction);
return;
}
QTreeWidgetItem* destination_item = itemFromIndex(index);
....
}
OP实际上询问了如何获得内部移动的通知,即如何在不对QTreeWidget进行子类的情况下进行通知(至少我是这样使用的,因为它是内置功能)。我刚刚找到了一种方法:连接到QTreeWidget模型的rowsInsered()信号!
connect(treeWidget->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));
顺便说一句,我找到了另一种方法来找出哪个元素确切地移动到了哪里,它避开了整个dropIndicatorPosition()和相关的itemAbove()、itemBelow()混乱,或者在不同父级之间移动项目时至少有助于补充它:
void MyTreeWidget::dropEvent(QDropEvent *event)
{
// get the list of the items that are about to be dragged
QList<QTreeWidgetItem*> dragItems = selectedItems();
// find out their row numbers before the drag
QList<int> fromRows;
QTreeWidgetItem *item;
foreach(item, dragItems) fromRows.append(indexFromItem(item).row());
// the default implementation takes care of the actual move inside the tree
QTreeWidget::dropEvent(event);
// query the indices of the dragged items again
QList<int> toRows;
foreach(item, dragItems) toRows.append(indexFromItem(item).row());
// notify subscribers in some useful way
emit itemsMoved(fromRows, toRows);
}
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- X11:移动窗口时获得通知
- 如何获得QTreeWidget内部项目移动的通知
- 如何在指定的注册表值更改时在ATL ActiveX控件中获取事件通知以用作windows移动ActiveX控件
- 来自Qt/C++的跨平台移动通知