首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSqlQueryModel QML在roleName中的参考误差

QSqlQueryModel QML在roleName中的参考误差
EN

Stack Overflow用户
提问于 2018-04-25 11:55:06
回答 1查看 687关注 0票数 1

我想从我的SQlite数据库中获取模型,当我在QSqlQueryModel中设置查询时,我可以获得行数、列数等等。但是,每个列中的数据都有一个ReferenceError,试图获取列的名称-- cpp代码:

代码语言:javascript
复制
//data base users
QSqlQueryModel *sqlModel = new QSqlQueryModel();
sqlModel->setQuery("SELECT usuarios.nombre FROM usuarios");

sqlModel->setHeaderData(0,Qt::Horizontal, QObject::tr("nombre"));
qDebug() << "ROL: " << sqlModel->roleNames();
qDebug() << "number of rows: " << sqlModel->rowCount();
qDebug() << "number of columns: " << sqlModel->columnCount();
qDebug() << "HEADER: " << sqlModel->headerData(1, Qt::Horizontal).toString();

这就是我从输出中得到的

这就是我在QML中的ListView中的内容:

代码语言:javascript
复制
ListView {
    id: listaUsuarios
    model: sqlModel
    delegate:
    Text{
        anchors.fill: parent
        text: nombre
     }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 12:19:06

如何观察表中的字段不是角色,因此不能从QML访问它们,因此要访问这些字段,必须将字段的名称作为角色添加,因此必须覆盖类:

代码语言:javascript
复制
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;
    }
};

示例:

代码语言:javascript
复制
#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();
}

输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50021702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档