Как наблюдать, как поля таблицы не являются ролями, поэтому к ним нельзя получить доступ из QML, поэтому для доступа к ним необходимо добавить имя поля в качестве роли, для этого класс должен быть перезаписан:
class SqlQueryModel: public QSqlQueryModel{
public:
using QSqlQueryModel::QSqlQueryModel;
QVariant data(const QModelIndex &index, int role) const
{
QVariant value;
if (index.isValid()) {
if (role < Qt::UserRole) {
value = QSqlQueryModel::data(index, role);
} else {
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}
}
return value;
}
QHash<int, QByteArray> roleNames() const
{
QHash<int, QByteArray> roles = QSqlQueryModel::roleNames();
for (int i = 0; i < this->record().count(); i ++) {
roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
}
return roles;
}
};
Пример:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QDebug>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
query.exec("create table usuarios (ID INTEGER PRIMARY KEY AUTOINCREMENT, "
"nombre VARCHAR(20), apellido VARCHAR(20))");
query.exec("insert into usuarios values(1, 'Danny', 'Young')");
query.exec("insert into usuarios values(2, 'Christine', 'Holand')");
query.exec("insert into usuarios values(3, 'Lars', 'Gordon')");
query.exec("insert into usuarios values(4, 'Roberto', 'Robitaille')");
query.exec("insert into usuarios values(5, 'Maria', 'Papadopoulos')");
return true;
}
class SqlQueryModel: public QSqlQueryModel{
public:
using QSqlQueryModel::QSqlQueryModel;
QVariant data(const QModelIndex &index, int role) const
{
QVariant value;
if (index.isValid()) {
if (role < Qt::UserRole) {
value = QSqlQueryModel::data(index, role);
} else {
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}
}
return value;
}
QHash<int, QByteArray> roleNames() const
{
QHash<int, QByteArray> roles = QSqlQueryModel::roleNames();
for (int i = 0; i < this->record().count(); i ++) {
roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
}
return roles;
}
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
if(!createConnection())
return -1;
SqlQueryModel sqlModel;
sqlModel.setQuery("SELECT usuarios.nombre FROM usuarios");
qDebug() << sqlModel.roleNames();
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("sqlModel", &sqlModel);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
Выход: