【问题标题】:How to select a row in TableView (QML)?如何在 TableView (QML) 中选择一行?
【发布时间】:2021-04-20 07:45:07
【问题描述】:

在 Qt 6 中,所有 QtQuick 1 组件都被删除。我想使用 Qt 6 重写一个旧应用程序。该应用程序使用 TableView 控件版本 1。

如何在新的控件TableView中选择一行并获取该行中所有单元格的值?

【问题讨论】:

标签: qt qml qt6


【解决方案1】:

我也遇到了同样的问题。这对我有用。

我使用 Qt 5.12QtQuick 2.12 中的 TableView

我在获取点击行的索引时遇到了麻烦。我发现DelegateChooserDelegateChoice 组件允许您访问TableView 中的行和列属性。在您获得 rowcolumn 表单 DelegateChoice 后,您可以使用它通过 QAbstractItemModel 方法 index(...)data(...) 访问模型中的数据,例如:

var idx = model.index(row, column)
var data = model.data(idx)

这里是完整的例子:

    import QtQuick 2.12             // TableView
    import Qt.labs.qmlmodels 1.0    // DelegateChooser
    
    // ...
    
    TableView {  
      id: usersTable
      model: tableModel
      
      anchors.fill: parent
      
      delegate: DelegateChooser
      {
        DelegateChoice
        {
          delegate: Rectangle {
            implicitWidth: 100
            implicitHeight: 50
            Text { text: display }
            
            MouseArea {
              anchors.fill: parent
              onClicked:
              {            
                // print value from clicked cell
                var idx = tableModel.index(row,column)
                console.log("Clicked cell: ", tableModel.data(idx))
                
                // print values from all cells in a row
                console.log("Clicked row: ")
                for (var i = 0; i < tableModel.columnCount(); i++)
                {
                  var idx2 = tableModel.index(row,i)
                  var data = tableModel.data(idx2)
                  console.log(data)
                }
              } // onClicked
            } // MouseArea
          } // Rectangle
        }// DelegateChoice
      } // DelegateChooser
    } // TableView

DelegateChooser 允许您为模型创建多个委托。如果您只有一个代表(如上面的示例),我不确定使用选择器是否是一种好习惯。但这种解决方法非常有效。

【讨论】:

    【解决方案2】:

    您还可以将 ItemDelegate 用于委托,使用作用域 model.display 访问模型数据(itemDelegate 具有继承的 display 属性)。您还必须显式处理当前选定的行,以及那些到项目,在简单的情况下这应该可以工作

        property int selectedRow: 1
    
        delegate: ItemDelegate {
            highlighted: row == view.selectedRow
            onClicked: view.selectedRow = row
            text: model.display
        }
    

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多