Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Qt获取的数据库记录字段值为空,数据存在于数据库中_Mysql_Qt - Fatal编程技术网

Mysql Qt获取的数据库记录字段值为空,数据存在于数据库中

Mysql 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

我有一个连接到数据库的Qt/QML应用程序,现在我想通过subcassed
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 items
model
属性从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>