Ошибка при передаче QStringListModel из cpp в qml
Пытаюсь вывести загруженные из папки изображения по сетке в Qt Widget через QListView. Загружаю изображения в c++, отображаю через qml
void MainWindow::on_load_triggered()
{
QStringList Names = QFileDialog::getOpenFileNames(this, "Выбор изображений", "C:/");
NameFolder.setStringList(Names);
QQuickView *view = new QQuickView;
view->setSource(QUrl::fromLocalFile("display.qml"));
view->show();
}
В qml отображаю по сетке, пишу туда свою полученную QStringListModel
GridView {
width: 300; height: 200
model: NameFolder {}
delegate: Column {
Image { source: portrait; anchors.horizontalCenter: parent.horizontalCenter }
Text { text: name; anchors.horizontalCenter: parent.horizontalCenter }
}
}
На это выдается ошибка на неизвестный элемент NameFolder. Пыталась использовать Q_PROPERTY - не работает, потому что это модель. Заголовочный файл выглядит так:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QStringListModel NameFolder;
private slots:
void on_load_triggered();
private:
Ui::MainWindow *ui;
};
Перепробовала несколько способов передачи между слоями c++ и qml, но с моделью ничего не работает как надо. Может кто знает как можно это сделать, желательно попроще?
Ответы (1 шт):
Автор решения: Ariox
→ Ссылка
Из документации qt
class Animal
{
public:
Animal(const QString &type, const QString &size);
...
};
class AnimalModel : public QAbstractListModel
{
Q_OBJECT
public:
enum AnimalRoles {
TypeRole = Qt::UserRole + 1,
SizeRole
};
AnimalModel(QObject *parent = 0);
...
};
QHash<int, QByteArray> AnimalModel::roleNames() const {
QHash<int, QByteArray> roles;
roles[TypeRole] = "type";
roles[SizeRole] = "size";
return roles;
}
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv);
AnimalModel model;
model.addAnimal(Animal("Wolf", "Medium"));
model.addAnimal(Animal("Polar bear", "Large"));
model.addAnimal(Animal("Quoll", "Small"));
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setInitialProperties({{"model", QVariant::fromValue(&model)}});
...
}
qml:
ListView {
width: 200; height: 250
required model
delegate: Text {
required property string type
required property string size
text: "Animal: " + type + ", " + size
}
}