我的 QSqlQueryModel 在列表视图中不显示数据

My QSqlQueryModel doesn't show data in the listview

本文关键字:显示 数据 视图 QSqlQueryModel 列表 我的      更新时间:2023-10-16

我正在玩QSqlQueryModel,但我现在完全卡住了。我一整天都在寻找解决办法,但到目前为止还没有找到。

我所做的工作是,它从我的sqlite数据库中提取数据,但出于某种原因,我不能在我的列表视图中显示它。看起来我的角色名不存在。
我收到类似....的信息ReferenceError: id没有定义.....

我使用的例子来自:http://qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML

这两个例子我都试过了,但我总是遇到同样的问题。
我的ccp文件是这样的:

#include "artistssqlmodel.h"
const char* ArtistsSqlModel::COLUMN_NAMES[] = {
    "id",
    "word",
    NULL
};
const char* ArtistsSqlModel::SQL_SELECT = "SELECT id, word FROM dictionary LIMIT 5";
ArtistsSqlModel::ArtistsSqlModel(QObject *parent) :
    QSqlQueryModel(parent)
{
    mydb=QSqlDatabase::addDatabase("QSQLITE");
    QString dbPath = "E://mydb.db";
    mydb.setDatabaseName(dbPath);
    connectToDb();
    int idx = 0;
    QHash<int, QByteArray> roleNames;
    while( COLUMN_NAMES[idx]) {
        roleNames[Qt::UserRole + idx + 1] = COLUMN_NAMES[idx];
        idx++;
    }
    //roleNames(roleNames);
    refresh();
}
void ArtistsSqlModel::connectToDb()
{
    //QString bla = "Default";
    if(!mydb.open())
    {
        qDebug() << "Database didnt open";
    }
    else
    {
        qDebug() << "Your database is open";
    }
}
void ArtistsSqlModel::refresh()
{
    this->setQuery(SQL_SELECT);
}
QVariant ArtistsSqlModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);
    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;
}

和我的QML文件看起来像这样

import QtQuick 2.2
import QtQuick.Window 2.1
Window {
    visible: true
    width: 800
    height: 800
    ListView{
        anchors.fill:parent
        model:artistsModel
        delegate: Item{
            width:parent.width
            height: width/10
            Text {
                id: name
                text: word
                verticalAlignment: Text.AlignVCenter
                horizontalAlignment: Text.AlignHCenter
                anchors.fill:parent
            }
        }
    }
}
我希望我提供了足够的信息,我希望有人知道我做错了什么。我是qt和c++的新手,但通常我可以通过一些研究来解决问题。这一次我完全卡住了,我需要找出一种方法从我的sqlite数据库中获取数据到我的listsviews。

编辑:感谢您的回复,这里是所有其余的代码(这些是我得到的文件)artistssqlmodel.h文件

#ifndef ARTISTSSQLMODEL_H
#define ARTISTSSQLMODEL_H
#include <QObject>
#include <QSqlQueryModel>
#include <QDebug>
class ArtistsSqlModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit ArtistsSqlModel(QObject *parent);
    void refresh();
    QVariant data(const QModelIndex &index, int role) const;
    void connectToDb();
signals:
public slots:
private:
    const static char* COLUMN_NAMES[];
    const static char* SQL_SELECT;
    QSqlDatabase mydb;
};

#endif // ARTISTSSQLMODEL_H

和main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "artistssqlmodel.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    ArtistsSqlModel *artistsSqlModel = new ArtistsSqlModel( qApp);
    context->setContextProperty("artistsModel", artistsSqlModel);
    engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
    return app.exec();
}

好像我的角色名不存在

。您不需要定义QML知道要查找的角色名。你得到这个例子的wiki已经过时了。为模型公开角色名的"新"方法是重新实现QAbstractItemModel::rolenames()方法。将rolennames定义移动到其中:

QHash<int, QByteArray> ArtistsSqlModel::rolenames() const
{
  int idx = 0;
  QHash<int, QByteArray> roleNames;
  while( COLUMN_NAMES[idx]) {
    roleNames[Qt::UserRole + idx + 1] = COLUMN_NAMES[idx];
    idx++;
  }  
  return roleNames;
}

顺便说一下,我建议你使用新的Qt文档,如果你还没有使用。我认为它比旧的更清晰和有条理。