如何在 TableView (QML) 中 select 一行?

How to select a row in TableView (QML)?

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

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

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

我使用 Qt 5.12QtQuick 2.12.

中的 TableView

我在获取点击行的索引时遇到了问题。我发现 DelegateChooser and DelegateChoice components allows you to access the row and column properties in TableView. After you got row and column form DelegateChoice you can use it to access data in model with QAbstractItemModel methods index(...) and 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 允许您为模型创建多个委托。如果您只有一个代表(如上例),我不确定使用选择器是否是一种好习惯。但该解决方法非常有效。

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

    property int selectedRow: 1

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