我正在使用 QTreeView 和 QStandardItemModel,我试图弄清楚如何使用按钮在树上上下移动项目。我可以毫无问题地进行拖放,但我想做的是有一些与“上移”和“下移”功能相关的按钮。我只是找不到有关该主题的任何内容。模型对象似乎有一个“moveRow()”函数,但我找不到任何关于它的文档,所以我不确定它是否是我需要的。您可以提供任何信息来指导我正确的方向,我们将不胜感激!
PS 这是我的 QT Creator 统计数据: Qt 创建者 2.6.2 基于Qt 5.0.1(64位)
你的预感是正确的。
moveRow()
是调用的正确函数。
要在一个父级中移动项目(毕竟它是一棵树),您可以执行
moveRow(parent, index.row(), parent, index.row() + delta)
,其中 delta
设置为 1 或 -1,具体取决于您是向下还是向上移动。
如果您希望允许项目在父级之间移动,则需要额外的逻辑来确定目标父级(如果该项目将移过其父级)。
请注意,如果移动按钮与要移动的项目分开,则被认为是糟糕的设计。您的代理应在其行中显示每个项目的向上和向下箭头,以便您只需单击一下即可移动内容。当存在连续选择时,代表应合并向上/向下箭头以覆盖所有项目。当选择不连续时,向上/向下箭头应该消失。
使用单独的按钮,您需要单击两次:首先选择项目,然后单击向上/向下。从用户体验的角度来看,这很糟糕。
moveRow
并未在 QStandardItemModel
中作为工作方法实现,因此它是一种(奇怪的)虚拟方法。已接受答案的回答者似乎在评论中暗示她/他知道这一点,但我认为他们的回答并非如此:听起来像是在埃里克发表第一个评论后才意识到的。
但实际上,即使您实现了
QTreeView
,它在 moveRow
子类的情况下也没那么有用,因为在树的情况下,您需要使用方法 QStandardItem.takeRow
、QStandardItem.takeRows
、QStandardItem.insertRow
和QStandardItem.insertRows
。这些都按预期工作,但实际实现非常繁琐(您必须检查 QModelIndex
是否有效,等等)。
它没有用,因为您实际上无法仅使用模型方法到达您创建的任何树的下游。您必须把手伸进
QModelIndex
和 QStandardItem
,并在它们之间切换等,从而弄脏双手。有两种有用的方法对此很有用:QStandardItemModel.itemFromIndex()
和 QStandardItem.index()
。