Mysql Qt获取的数据库记录字段值为空,数据存在于数据库中
我有一个连接到数据库的Qt/QML应用程序,现在我想通过subcassedMysql Qt获取的数据库记录字段值为空,数据存在于数据库中,mysql,qt,Mysql,Qt,我有一个连接到数据库的Qt/QML应用程序,现在我想通过subcassedQSqlQueryModel获取数据: #ifndef UEPEOPLEMODEL_H #define UEPEOPLEMODEL_H #include <QImage> #include <QVariant> #include <QStringList> #include <QDebug> #include <QHash> #include <QByte
QSqlQueryModel
获取数据:
#ifndef UEPEOPLEMODEL_H
#define UEPEOPLEMODEL_H
#include <QImage>
#include <QVariant>
#include <QStringList>
#include <QDebug>
#include <QHash>
#include <QByteArray>
#include <QSqlError>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QModelIndex>
#include <QQuickImageProvider>
#include <QByteArray>
#include <QSqlRecord>
#include <QDebug>
#include <QSqlQuery>
#include "../settings/uedefaults.h"
#include "../settings/uetypes.h"
class UePeopleModel : public QSqlQueryModel,
public QQuickImageProvider
{
Q_OBJECT
private:
QSqlDatabase m_ueDb;
private:
QSqlDatabase ueDatabase() const
{ return this->m_ueDb; }
void ueSetDatabase(const QSqlDatabase& database)
{ this->m_ueDb=database; }
public:
UePeopleModel(QObject *parent=0);
~UePeopleModel();
QVariant data(const QModelIndex &index,
int role) const Q_DECL_OVERRIDE;
QImage ueImage(const QString &id) const;
QImage requestImage(const QString &id,
QSize *size,
const QSize &requestedSize);
UeTypeRoles roleNames() const;
public:
static const int ueRoleName=Qt::UserRole+1;
static const int ueRoleImage=Qt::UserRole+2;
};
#endif // UEPEOPLEMODEL_H
为什么我从表中获取空值?!
嗯,我一直在研究这个问题,在Qt文档中它说:
如果模型未初始化,将返回一条空记录
指向文档的链接:。这可能是问题所在,但是,我在main.cpp
中初始化了UePeopleModel:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
UePeopleModel* uePeopleModel=new UePeopleModel(qApp);
engine.rootContext()->setContextProperty("uePeopleModel",
uePeopleModel);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
我还缺少什么?我已经检查了很多次db连接,这是正常的,我也从表中得到字段名,但并没有数据
嗯,我已经将调试代码添加到QVariant-UePeopleModel::data(const-QModelIndex&index,int-role)
const-method:
QVariant UePeopleModel::data(const QModelIndex &index,
int role) const
{
switch(role)
{
case ueRoleImage:
{
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_IMAGE).toByteArray();
break;
} // case
case ueRoleName:
{
int nrrecords=this->rowCount(QModelIndex());
QString name=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();;
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();
} break; // case
case ueRolePassword:
{
QString password=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_APPPASSWORD).toString();
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_APPPASSWORD).toString();
} break; // case
default:
return QVariant();
} // switch
return QSqlQueryModel::data(index,
role);//value;
} // data
在行
int nrrecords=this->rowCount(QModelIndex())之后代码>我设置了一个断点,临时变量nrrecord
保存值5-这是数据库中记录的绝对数量!那么为什么方法的参数索引为空??正在通过QML itemsmodel
属性从QML文件调用data()
方法。至少存在以下问题:
您的开关盒全部失效(您必须在每个开关盒之后断开开关盒)
您不需要访问私有成员,您应该直接使用它们。这就是为什么他们是私人的。当您希望将实现细节与公共(或受保护)接口隔离时,访问器用作封装。删除m_ueDb
的访问器并直接使用该成员
数据的实现将只为图像角色提供值。必须将默认角色访问转发到基类的数据()
:
@库保德,这是我的注意事项:回答1)好的,我将直接访问成员,但我确实连接到了数据库,我正在监视双方(应用程序和mysql服务器,连接是活动的,在我的问题中,我甚至在运行时得到了文件名,如果没有成功的db连接,这是不可能的)回答2)我知道,但我正在努力遵循每个成员都有“能手/能手”的规则。Anwser 3)如何将默认角色转发到基类的数据()?回答4)我看不到include文件和.pro文件之间的关系。我的.pro文件中有QT+=sql。我认为你错了。@MarkoFrelih在include路径中不需要QtSql/
前缀。这不是,而且在最近一段时间里从来没有必要。如果您使用它,您就隐藏了项目配置错误,而只是将问题转移到了链接时间。include路径和.pro
之间的关系很简单:如果您错过了.pro
文件中的QT+=sql
,则
include将失败,但
将“起作用”-它将编译,但不会链接。@MarkoFrelih“我正在尝试遵循规则每个成员都有getter/setter”该规则是有原因的,原因是来自类用户的封装。当您实现该类时,您不是用户,而是您自己。封装没有任何理由,所以不要这样做。这些规则对你来说必须是有意义的,否则你在巫毒崇拜上浪费时间。@MarkoFrelih我在第1点上错了,所以我把它删除了QSQLDABASE
是一个显式共享类,不是真正的普通值类。好吧,但是,为什么我要获取字段名而不是数据本身??向我们显示执行的SQL,但无法提供所需的结果。@RickJames SQL语句是:选择ID、名称、应用密码、卡、角色、可见、来自可见的人的图像=1
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
UePeopleModel* uePeopleModel=new UePeopleModel(qApp);
engine.rootContext()->setContextProperty("uePeopleModel",
uePeopleModel);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
QVariant UePeopleModel::data(const QModelIndex &index,
int role) const
{
switch(role)
{
case ueRoleImage:
{
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_IMAGE).toByteArray();
break;
} // case
case ueRoleName:
{
int nrrecords=this->rowCount(QModelIndex());
QString name=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();;
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();
} break; // case
case ueRolePassword:
{
QString password=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_APPPASSWORD).toString();
return this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_APPPASSWORD).toString();
} break; // case
default:
return QVariant();
} // switch
return QSqlQueryModel::data(index,
role);//value;
} // data
QVariant UePeopleModel::data(const QModelIndex &index, int role) const
{
switch(role) {
case ueRoleImage:
for(int iIndex=0; iIndex<this->record().count(); iIndex++) {
qDebug() << this->record().fieldName(iIndex) <<
<< this->record().value(iIndex) <<
<< index.row();
}
return record(index.row()).value(
UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_IMAGE).toByteArray();
case ueRoleName:
return record(index.row()).value(
UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();
}
return QSqlQueryModel::data(index, role);
}
// CORRECT
#include <QSqlError>
// WRONG
#include <QtSql/QSqlError>