QTreeView 用按钮移动项目

问题描述 投票:0回答:2

我正在使用 QTreeView 和 QStandardItemModel,我试图弄清楚如何使用按钮在树上上下移动项目。我可以毫无问题地进行拖放,但我想做的是有一些与“上移”和“下移”功能相关的按钮。我只是找不到有关该主题的任何内容。模型对象似乎有一个“moveRow()”函数,但我找不到任何关于它的文档,所以我不确定它是否是我需要的。您可以提供任何信息来指导我正确的方向,我们将不胜感激!

PS 这是我的 QT Creator 统计数据: Qt 创建者 2.6.2 基于Qt 5.0.1(64位)

c++ qt
2个回答
2
投票

你的预感是正确的。

moveRow()
是调用的正确函数。

要在一个父级中移动项目(毕竟它是一棵树),您可以执行

moveRow(parent, index.row(), parent, index.row() + delta)
,其中
delta
设置为 1 或 -1,具体取决于您是向下还是向上移动。

如果您希望允许项目在父级之间移动,则需要额外的逻辑来确定目标父级(如果该项目将移过其父级)。

请注意,如果移动按钮与要移动的项目分开,则被认为是糟糕的设计。您的代理应在其行中显示每个项目的向上和向下箭头,以便您只需单击一下即可移动内容。当存在连续选择时,代表应合并向上/向下箭头以覆盖所有项目。当选择不连续时,向上/向下箭头应该消失。

使用单独的按钮,您需要单击两次:首先选择项目,然后单击向上/向下。从用户体验的角度来看,这很糟糕


0
投票

moveRow
并未在
QStandardItemModel
中作为工作方法实现,因此它是一种(奇怪的)虚拟方法。已接受答案的回答者似乎在评论中暗示她/他知道这一点,但我认为他们的回答并非如此:听起来像是在埃里克发表第一个评论后才意识到的。

但实际上,即使您实现了

QTreeView
,它在
moveRow
子类的情况下也没那么有用,因为在树的情况下,您需要使用方法
QStandardItem.takeRow
QStandardItem.takeRows
QStandardItem.insertRow
QStandardItem.insertRows
。这些都按预期工作,但实际实现非常繁琐(您必须检查
QModelIndex
是否有效,等等)。

它没有用,因为您实际上无法仅使用模型方法到达您创建的任何树的下游。您必须把手伸进

QModelIndex
QStandardItem
,并在它们之间切换等,从而弄脏双手。有两种有用的方法对此很有用:
QStandardItemModel.itemFromIndex()
QStandardItem.index()

© www.soinside.com 2019 - 2024. All rights reserved.