gpt4 book ai didi

c++ - 我的 QSqlQueryModel 不在 ListView 中显示数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:05 25 4
gpt4 key购买 nike

我一直在玩 QSqlQueryModel,但我现在完全卡住了。我一整天都在寻找解决方案,但到目前为止还没有成功。

我所做的工作是它从我的 sqlite 数据库中提取数据,但由于某种原因我无法在我的 ListView 中显示它。看起来我的角色名不存在。
我收到类似....ReferenceError: id is not defined..... 对于我从数据库中提取的每一行的消息。

我使用了一个例子: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 数据库获取到我的 ListView 中。

编辑:感谢您的回复这里是所有代码的其余部分(这些是我得到的文件)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();
}

最佳答案

It looks like my rolenames do not exist

没错。您没有定义 QML 知道要查找的角色名称。您获得示例的 wiki 已过时。公开模型角色名称的"new"方法是重新实现 QAbstractItemModel::rolenames()方法。将 rolenames 定义移动到它:

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;
}

顺便说一句,我建议你使用the new Qt documentation , 如果你还没有使用。我认为比旧的要清晰和有条理。

希望对你有帮助

关于c++ - 我的 QSqlQueryModel 不在 ListView 中显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com