首页 文章

如何重新排序QML GridLayout中的项目?

提问于
浏览
3

如何重新排序GridLayout(或其他QML项容器)中的项目?我有一个有一些行和列,并填充了子项 . 直到几分钟前,我希望我可以简单地对项目的 children 列表成员进行操作以对它们进行重新排序:我在UI中有一个 MouseArea 按钮,我希望它可以简单地调用(来自 onClicked: )a

function reorder() {children.unshift(children.pop());}

布局项的方法(布局中最后一项的意图成为第一个),但是当触发时会生成错误消息:

TypeError: Property 'pop' of object [object Object] is not a function

无论如何我注意到文档说 children 是只读的 .

有这么简单的方法吗? (关于动态对象管理的documentation实际上并不包括创建和销毁子对象的内容 . )

2 回答

  • 2

    您可以使用rowcolumn附加属性 .

  • 3

    在Mitch回答之后,我想出了这个:

    function reorder() {
        for (var i=0;i<children.length;i++) {
          var index=columns*children[i].Layout.row + children[i].Layout.column;
          var newIndex=(index+1)%(rows*columns);
          children[i].Layout.row=Math.floor(newIndex/columns)%rows;
          children[i].Layout.column=newIndex%columns;
        }
      }
    

    有几点需要注意:

    • 为此,您必须在已包含的项目上明确设置 Layout.rowLayout.column . 如果您依赖于 GridLayout 的单元格分配,则附加属性保持为零 . 这有点令人惊讶,因为我最初阅读documentation暗示GridLayout实际上设置了这些本身,如果你没有 .

    • 您还需要在布局上明确设置 rowscolumns (对于从左到右的布局,您只需设置列以进行布局包装,然后行属性保持为-1,无论子行数是多少项目已添加,上述代码将失败) .

    • 随着项目的混乱,它会发出一些控制台警告,例如 QGridLayoutEngine::addItem: Cell (1, 1) already taken . 虽然似乎很难受 .

    • 显然,以上只是真正期待处理完全填充的单细胞物品网格 .

相关问题