QtQuick TableView不使用C++-QAbstractTable模型

QtQuick TableView不使用C++-QAbstractTable模型,qt,tableview,qml,Qt,Tableview,Qml,我试图让Qt模型/视图体系结构与QML视图一起工作,但不管出于什么原因,它只是部分工作 工作原理: 行数 资料 罗莱曼 不工作: columnCount(调用了该方法,但似乎没有效果,只要它大于0) headerData(这实际上应该设置列标题吗?所有示例都在QML中设置标题) 旗帜 设置数据 我正在尝试(已经有几周了)创建一个简单的ApplicationView,其中包含一个TableView和一个C++模型,该模型可由视图编辑 现在只有整行是可选择的,而不是单个单元格。表数据似乎根本

我试图让Qt模型/视图体系结构与QML视图一起工作,但不管出于什么原因,它只是部分工作

工作原理:

  • 行数
  • 资料
  • 罗莱曼
不工作:

  • columnCount(调用了该方法,但似乎没有效果,只要它大于0)
  • headerData(这实际上应该设置列标题吗?所有示例都在QML中设置标题)
  • 旗帜
  • 设置数据
我正在尝试(已经有几周了)创建一个简单的ApplicationView,其中包含一个TableView和一个C++模型,该模型可由视图编辑

现在只有整行是可选择的,而不是单个单元格。表数据似乎根本不可编辑。谁能给我一个提示吗

main.qml

ApplicationWindow {
    visible: true
    id: root
    Component {
        id: editableDelegate
        Item {
            Text {
                width: parent.width
                anchors.margins: 4
                anchors.left: parent.left
                anchors.verticalCenter: parent.verticalCenter
                elide: styleData.elideMode
                text: styleData.value !== undefined ? styleData.value : ""
                color: styleData.textColor
                visible: !styleData.selected
            }
            Loader {
                id: loaderEditor
                anchors.fill: parent
                anchors.margins: 4
                Connections {
                    target: loaderEditor.item
                    onEditingFinished: {
                        theModel.setData(styleData.row, styleData.column, loaderEditor.item.text)
                    }
                }
                sourceComponent: styleData.selected ? editor : null
                Component {
                    id: editor
                    TextInput {
                        id: textinput
                        color: styleData.textColor
                        text: styleData.value
                        MouseArea {
                            id: mouseArea
                            anchors.fill: parent
                            hoverEnabled: true
                            onClicked: textinput.forceActiveFocus()
                        }
                    }
                }
            }
        }
    }
    TableView {
        id: table
        anchors.fill: parent
        model: theModel
        itemDelegate: editableDelegate;
        TableViewColumn {
            role: "nameRole"
            width: 75
            title: "name"
        }
        TableViewColumn {
            role: "ageRole"
            width: 50
            title: "age"
        }
    }
}
导入QtQuick 2.3
导入QtQuick.Controls 1.2
应用程序窗口{
可见:正确
宽度:640
身高:480
标题:qsTr(“你好世界”)
桌面视图{
型号:theModel
TableViewColumn{
角色:“nameRole”
宽度:75
}
TableViewColumn{
角色:“Agrole”
宽度:50
}
}

}
columnCount
rowCount
在方法中调用,该方法在
data
方法之前由TableView调用

QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent) const
{
    return hasIndex(row, column, parent) ? createIndex(row, column, 0) : QModelIndex();
}

bool QAbstractItemModel::hasIndex(int row, int column, const QModelIndex &parent) const
{
    if (row < 0 || column < 0)
        return false;
    return row < rowCount(parent) && column < columnCount(parent);
}
要将更改应用于模型,应实现
setData
方法,如下所示:

TableModel.h

bool setData(const QModelIndex &index, const QVariant &value, int role) {
    switch (role) {
        case NameRole: items[index.row()]->name = value.toString(); break;
        case AgeRole: items[index.row()]->age = value.toInt(); break;
    }
    emit dataChanged(index, index);
    return true;
}

Q_INVOKABLE bool setData(int row, int column, const QVariant value)
{
    int role = Qt::UserRole + 1 + column;
    return setData(index(row,0), value, role);
}

上面的答案很好地涵盖了事情。我只想补充几点:

  • 在QML中,您只需在项委托中执行
    model.role=value
    ,而不必手动调用setData()
  • 在Qt5.5中,几个
    qabstractemmodel
    方法,包括
    setData()
    ,已使
    Q\u可调用

感谢Marc提供的SSCCE。我不擅长qml,但是我投了更高的票。哇,非常感谢!我自己永远也找不到这个解决办法。@MarcQ:好的问题应该得到好的答案;-)谢谢,Meefte(向上投票)。你能在上面的上下文中为model.role=value提供一个例子吗?是否必须为每个item tableview委托单独设置角色值,或者是否可以将其应用于itemDelegate?另外,如果setDate设置为Q_INVOKABLE,那么如何从QML调用它?