qt — передать QStandardItemModel из C ++ в QtQuick / QML TableView и отобразить его

В настоящее время я пытаюсь передать 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-элемент добавлено следующее):

TableViewColumn{ role: "title"  ; title: "Title" ; width: 100 }
TableViewColumn{ role: "author" ; title: "Author" ; width: 200 }

Мое предположение: мне нужно добавить и такую ​​строку. Тем не менее, я не мог понять, где получить роль от C ++ QStandardItemModel? Нужно ли даже устанавливать роль? По крайней мере, примеры QWidgets с «классическим» QTreeView просто установить модель и все было хорошо …

2

Решение

Вы можете подкласс QStandardItemModel и повторно внедрить roleNames() чтобы определить желаемые имена ролей:

#include <QStandardItemModel>

class MyModel : public QStandardItemModel
{

public:

enum Role {
role1=Qt::UserRole,
role2,
role3
};explicit MyModel(QObject * parent = 0): QStandardItemModel(parent)
{
}
explicit MyModel( int rows, int columns, QObject * parent = 0 ): QStandardItemModel(rows, columns, parent)
{
}

QHash<int, QByteArray> roleNames() const
{
QHash<int, QByteArray> roles;
roles[role1] = "one";
roles[role2] = "two";
roles[role3] = "three";

return roles;
}
};

После добавления элементов вы можете установить данные для модели, например:

model->setData(model->index(0,0), "Data 1", MyModel::role1);
model->setData(model->index(0,1), "Data 2", MyModel::role2);
model->setData(model->index(0,2), "Data 3", MyModel::role3);

Теперь в qml вы можете получить доступ к различным столбцам по именам ролей:

TableView {

TableViewColumn {title: "1"; role: "one"; width: 70 }
TableViewColumn {title: "2"; role: "two"; width: 70   }
TableViewColumn {title: "3"; role: "three"; width: 70 }

model: myModel

}
2

Другие решения

Добавление данных в модель, как в ответе Нежата, в моем случае не сработало (Qt 5.5). Данные должны были быть добавлены следующим образом:

QStandardItem* it = new QStandardItem();
it->setData("data 1", MyModel::role1);
it->setData("data 2", MyModel::role2);
it->setData("data 3", MyModel::role3);
model->appendRow(it);

Ниже приведен полный пример ответа Неджата с этой модификацией (также доступен здесь: https://github.com/psimona/QStandardItemModel_Example )

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>

// QStandardItemModel derived class
#include <QStandardItemModel>
class MyModel : public QStandardItemModel {

public:
enum Role {
role1=Qt::UserRole,
role2,
role3
};

explicit MyModel(QObject * parent = 0): QStandardItemModel(parent){}
explicit MyModel( int rows, int columns, QObject * parent = 0 )
: QStandardItemModel(rows, columns, parent){}

QHash<int, QByteArray> roleNames() const{
QHash<int, QByteArray> roles;
roles[role1] = "one";
roles[role2] = "two";
roles[role3] = "three";
return roles;
}
};// Main
int main(int argc, char *argv[])
{
QApplication app(argc, argv);MyModel* model = new MyModel;QStandardItem* it = new QStandardItem();
it->setData("data 1", MyModel::role1);
it->setData("data 2", MyModel::role2);
it->setData("data 3", MyModel::role3);
model->appendRow(it);

it = new QStandardItem();
it->setData("more data 1", MyModel::role1);
it->setData("more data 2", MyModel::role2);
it->setData("more data 3", MyModel::role3);
model->appendRow(it);

QQmlApplicationEngine engine;
// register cpp model with QML engine
engine.rootContext()->setContextProperty("myModel", model);

// Load qml file in QML engine
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

main.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true

TableView {

anchors.fill: parent

TableViewColumn {title: "1"; role: "one"; width: 150 }
TableViewColumn {title: "2"; role: "two"; width: 150   }
TableViewColumn {title: "3"; role: "three"; width: 150 }

model: myModel

}
}
0

По вопросам рекламы [email protected]