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