【发布时间】:2014-12-01 14:42:49
【问题描述】:
我一直在尝试使用 QML TableView 来显示 QAbstractTableModel。等式的缺失部分似乎是在TableView 中不可能有可变数量的列,尽管覆盖了QAbstractItemModel::roleNames,它应该告诉Qt 我的列的数量和名称。我尝试仅使用 QML 对此进行测试:
import QtQuick 2.0
import QtQuick.Controls 1.1
Rectangle {
anchors.fill: parent
property real showImage: 1.0
width: 500
TableView {
id: myTable
model: myModel
// TableViewColumn {
// role: "title"; title: "Name"; width: 200
// }
}
ListModel {
id: myModel
ListElement {
title: "item one"
}
ListElement {
title: "item two"
}
}
}
尽管TableView 的模式包含ListElements 并在其中定义了角色,但运行时它不会显示任何内容。
但是,如果取消注释上述代码并且定义了 TableViewColumn,则该列将按预期显示该角色的数据,但该表仍不会显示任何其他角色。显然,这仅适用于静态定义的列数,而不适用于直到运行时才知道列数的情况。
给出的示例与我的实际示例基本相同,只是我的模型是用 C++ 定义的。
似乎这可能已经被问过here,但它没有得到任何回应。
编辑:我曾尝试调用 javascript 函数:
function addColumnToTable(roleName) {
var columnString = 'import QtQuick 2.3; import QtQuick.Controls 1.2; TableViewColumn {role: "'
+ roleName + '"; title: "' + roleName + '"; width: 40}';
var column = Qt.createQmlObject(
columnString
, myTable
, "dynamicSnippet1")
myTable.addColumn(column);
}
来自 C++:
QVariant roleName = "name";
QObject *root = view->rootObject();
QMetaObject::invokeMethod(root, "addColumnToTable", Q_ARG(QVariant, roleName));
这至少允许我从 C++ 动态添加列,尽管不是从模型/视图架构中。 Yoann 的解决方案远比这要好。
【问题讨论】: