【发布时间】:2014-09-17 11:21:16
【问题描述】:
我目前正在尝试将 QStandardItemModel 传递给 QtQuick TableView 然后显示它。这基本上是我的代码(只是一个简化的摘录,所以我希望我没有在这里添加任何额外的错误)。
C++/Qt 部分:
foo.cpp
[...]
QStandardItemModel *Foo::getModel()
{
QStandardItemModel *model = new QStandardItemModel(this);
QList<QStandardItem*> standardItemList;
QList<QString> data;
data.append("Cat");
data.append("Dog");
data.append("Mouse");
foreach (QString cell, comInputData->getHeadings()) {
QStandardItem *item = new QStandardItem(cell);
standardItemList.append(item);
}
// we only add one row here for now; more will come later
model->appendRow(standardItemList);
standardItemList.clear();
return model;
}
[...]
main.cpp
Foo f;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myModel", f.getModel());
engine.load(QUrl(QStringLiteral("qrc:///InputView.qml")));
QtQuick / QML 部分:
InputView.qml
TableView {
id: monitorInputVectorsTable
[... positioning and sizing ...]
model: myModel
}
我想,我仍然缺少 QML 部分中的一些重要部分,是吗?我发现了一些这样的内联模型定义示例:
ListModel {
id: libraryModel
ListElement{ title: "A Masterpiece" ; author: "Gabriel" }
ListElement{ title: "Brilliance" ; author: "Jens" }
}
...以这种方式显示(在TableView-item中添加了以下内容):
TableViewColumn{ role: "title" ; title: "Title" ; width: 100 }
TableViewColumn{ role: "author" ; title: "Author" ; width: 200 }
我的猜测:我也需要添加这样的一行。但是,我不知道从 C++ QStandardItemModel 那里获得角色?甚至有必要设置角色吗?至少带有“经典”QTreeView 的 QWidgets 示例只是设置了模型,一切都很好......
【问题讨论】:
-
对于 QStandardItemModel,您设置的数据的隐含角色是
Display角色。我从未尝试在 TableView 上设置这样的模型,使用 ListView 更合适,因为您的模型中没有“列”概念。 -
感谢您的评论。在我的完整代码中,将有“列”,即参数(每个都有一个列)随时间变化(行)(这些值是从 csv 文件中解析的)。所以我认为 TableView 是正确的方法。虽然我现在添加了
TableViewColumn{ role: "Display" ; title: "Title" ; },但 TableView 仍然是空白的...:/ -
好吧,我刚刚发现我应该尝试一个非大写的“显示”(``TableViewColumn{ role: "display" ; title: "Title" ; }
. Then the TreeView finally displays something: the first value (in the example "Cat") - which is logical because I have got only one row for now. Now I still need to display the other columns also. Adding just anotherTableViewColumn{... }` 不起作用 - (因为它是同一个角色?)它只再次显示相同的第一个值。我想知道如何只显示一些列和/或如何手动设置角色? -
如果你翻译一个 csv 来提供一个自定义模型,你应该继承 QAbstractTableModel。请参阅subclassing section。您需要在那里定义角色名称。
标签: c++ qt tableview qml qtquick2