gpt4 book ai didi

c++ - 拖放移动后获取新旧 QStandardItem

转载 作者:行者123 更新时间:2023-11-28 06:15:52 27 4
gpt4 key购买 nike

我正在尝试创建一个支持项目内部移动的 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

关于如何解决这个问题有什么想法吗?

最佳答案

有一种更好的方法可以使用 QAbstractItemModel::rowsMoved 来获取移动的项目来自文档:

This signal is emitted after rows have been moved within the model. The items between sourceStart and sourceEnd inclusive, under the given sourceParent item have been moved to destinationParent starting at the row destinationRow.

此外,我还记得在 QQ 中阅读过在项目 View 中使用撤消/重做,我能找到的最佳链接是这个 cached page和一个 French version

关于c++ - 拖放移动后获取新旧 QStandardItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com