QML-How-to匿名访问代表内的TableView?

时间:2014-05-07 15:34:56

标签: qml

使用QML,我正在编写一个自定义的itemDelegate和rowDelegate,我希望能够在任意数量的不同TableView实例中使用它。正如下面的代码所示,我已经能够实现这一点 - 但只是在某种程度上,我非常怀疑它在将来(或之前,就此而言)Qt发布时的工作情况。我目前正在使用Qt 5.2。

Component {
    id: tableRowDelegate

     Rectangle {
     height: 16
     color: styleData.selected ? "#448" : (styleData.alternate? "#eee" : "#fff")

     property TableView tableView

     // The view is 8 levels up for the rowDelegate
     Component.onCompleted: {
          if (styleData.row > -1)  // Not entirely sure why this is needed -- worse, I don't know why it works; it just does
                tableView = parent.parent.parent.parent.parent.parent.parent.parent
      }

 // Other delegate code omitted for brevity
    }
}

Component {

id: tableCellDelegate

Rectangle {
    width: parent.width
    height: parent.height
    color: "transparent"
    border.color: "#a3b3b3"
    border.width: 1
    radius: 5

    property TableView tableView

    // The View is 9 levels up for the itemDelegate
    Component.onCompleted: {
        tableView = parent.parent.parent.parent.parent.parent.parent.parent.parent
    }

 // Other delegate code omitted for brevity
}

}

构建这些委托后,访问封闭的TableView是微不足道的 (和匿名的)通过在'tableView。'前面添加属性或信号名称;即。

tableView.alternatingRowColors

。 。 。仅举例来说。

没有更好的方法可以在委托中访问视图 如上例所示,对祖先进行硬编码,或者更糟糕的是:没有硬性约束 显式到TableView的id?

警告:我还没有实际对此进行测试,以确保它能够与第二个TableView一起使用。 它确实适用于我正在测试的那个。

感谢您的任何想法!

韦恩


更新答案。再次感谢mlvljr,帮助我集思广益。

内联,在TableView级别,我可以使用Loader元素作为一种包装器委托来创建与" real"的松散绑定。代表;如下:

rowDelegate : Loader {
    property TableView tableView        : itemsAcquiredList
    property QtObject  styleDataExported: styleData
    sourceComponent: tableRowDelegate
}

然后可以使用Loader中定义的那些属性 我的真实"代表。我可以将该块复制粘贴到任何其他块中 TableView,只更改分配给tableView属性的id,以及 然后将它与我的可重用代表一起使用。

事实证明,当我使用加载器来获取我的委托,styleData和 模型不再直接在加载的委托中可用;因此 需要'styleDataExported' Loader中的属性(tableView 属性现在提供对模型的访问)。所以,对于额外的糖衣, 我可以在加载的委托中添加两个属性绑定,如下所示:

property QtObject  styleData: styleDataExported
property var       model    : tableView.model

中提琴!现在,我的代理人的代码看起来就像一个真实的代码,而我 可以从TableView获取所有属性,信号和方法 祖先没有使用过它的' id',而且从未做过任何事情 关于代表内部祖先的假设。

我不太了解装载机,或者我是否会表演 这样做的惩罚,但它确实给了我一个干净的分离和 视图和委托之间的松散绑定。现在,这是 正是我在寻找的东西。

更新II:我已经使用itemDelegate和rowDelegate对此进行了测试, 他们都按预期工作。

0 个答案:

没有答案