У меня есть класс модели, наследующий QAbstractListModel
:Qt Доступ к модели данных за пределами ItemDelegate
VehiclesModel.h
:
class VehiclesModel : public QAbstractListModel {
Q_OBJECT
public:
enum Roles {
ImagePathRole = Qt::UserRole + 1, // QString
NameRole // QString
};
virtual int rowCount(const QModelIndex & parent = QModelIndex()) const override { ... }
virtual QVariant data(const QModelIndex & index, int role) const override { ... }
virtual QHash<int, QByteArray> roleNames() const override {
QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
roles[ImagePathRole] = "imagePath";
roles[NameRole] = "name";
return roles;
}
};
main.cpp
:
#include "VehiclesModel.h"
int main(int argc, char * argv[]) {
QGuiApplication app(argc, argv);
VehiclesModel vehiclesModel;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("vehiclesModel", &vehiclesModel);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
И ComboBox
, который отображает эту модель: main.qml
:
ComboBox {
id: control
model: vehiclesModel
delegate: ItemDelegate {
contentItem: RowLayout {
Image {
source: imagePath
}
Label {
text: name
}
}
highlighted: control.highlightedIndex == index
}
contentItem: RowLayout {
Image {
source: ??imagePath??
}
Label {
text: ??name??
}
}
}
Я хочу настроить ComboBox
, чтобы показать изображение и название автомобиля. Я могу получить доступ к данным модели от ItemDelegate
, но как получить доступ к данным модели за пределами ItemDelegate
? Например, я хочу получить данные текущего индекса (ImagePathRole
и NameRole
), чтобы отобразить изображение и имя транспортного средства в contentItem
.
Можно ли сделать это без вызова QAbstractListModel
методов напрямую (т.е. index()
и data()
методы) и делает их Q_INVOKABLE
?
Как это «точно, что ищет OP»? Не могли бы вы объяснить это в своем ответе?Что вы подразумеваете под «простым и приятным синтаксисом с минимальными накладными расходами, записывающими ваши сеттеры/геттеры»? Как это относится к вопросу? Я также не вижу смысла вашего последнего предложения (Q_PROPERTY используются для определения ролей модели, а не для доступа к модели в QML). – GrecKo
См. Обновленный ответ. – Bartel
Спасибо за обновление вашего ответа и показ того, как можно использовать lib. Мои вопросы по-прежнему остаются без ответа, ожидаются 2 первых. Простым и приятным синтаксисом, я считаю, вы говорите о его qt-supermacros lib, который неясно, что вы используете в своем ответе. Ваше предложение о Q_PROPERTY все еще не ясно и довольно расплывчато. – GrecKo