我正在尝试创建一个支持项目内部移动的QTreeView,以及一种检测移动源和目标的方法。使用QTreeWidget时,我可以覆盖dropEvent,并执行以下操作:
void MyTreeWidget::dropEvent(QDropEvent* event)
{
QList<QStandardItem*> dragItems = selectedItems();
QTreeView::dropEvent(event);
// here dragItems have been moved to the new places so I can do whatever I want
}
我需要知道源位置和目标位置的原因是能够将命令推送到在基础数据结构中执行相同移动的撤消堆栈。
我现在已经使用QStandardItemModel切换到QTreeView(创建一个描述底层数据结构的自定义模型会有太多工作)但它看起来有点不同。在调用QTreeView :: dropEvent(...)之后,它已创建并添加了新项但未删除旧项,因此我无法确定新索引,因为一旦删除旧项就会更改。我正在使用此示例来调试它:
#include <QtDebug>
#include <QApplication>
#include <QTreeView>
#include <QtGui/QStandardItemModel>
class MyTreeView : public QTreeView
{
public:
MyTreeView(QWidget* parent=0)
: QTreeView(parent)
{}
void dropEvent(QDropEvent* event) {
qDebug() << "rows before:" << model()->rowCount();
QTreeView::dropEvent(event);
qDebug() << "rows after:" << model()->rowCount();
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyTreeView* tree = new MyTreeView();
QStandardItemModel model(3, 1);
for(int r = 0; r < model.rowCount(); r++)
model.setItem(r, 0, new QStandardItem(QString("%0").arg(r)));
tree->setDragEnabled(true);
tree->viewport()->setAcceptDrops(true);
tree->setDefaultDropAction(Qt::MoveAction);
tree->setDropIndicatorShown(true);
tree->setDragDropMode(QAbstractItemView::InternalMove);
tree->setModel(&model);
tree->show();
return app.exec();
}
当我在Qt 5.4(Windows 7)上运行此项并拖放项目时,我得到以下输出:
rows before: 3
rows after: 4
当使用QTreeWidget时,它会说:
rows before: 3
rows after: 3
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
使用QAbstractItemModel::rowsMoved
获取移动项目有一种更好的方法
来自文档:
在模型中移动行之后发出此信号。 给定的 sourceStart 和 sourceEnd 之间的项目 sourceParent 项已从 destinationParent 移至 row destinationRow 。
另外,我记得在QQ上阅读使用撤消/重做项目视图,我能找到的最佳链接是cached page和French version