» »

Qt/QML zajem podatkov iz podatkovne baze, dobim samo opise fieldov ter prazne vrednosti

Qt/QML zajem podatkov iz podatkovne baze, dobim samo opise fieldov ter prazne vrednosti

KernelPanic ::

Spostovane dame in gospodje!

Imam perec problem z naslednjim razredom, ki je sestanvi del Qt/QML aplikacije:
#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

ter njegova implementacija:
#include "uepeoplemodel.h"

UePeopleModel::UePeopleModel(QObject* parent)
    : QSqlQueryModel(parent),
      QQuickImageProvider(QQmlImageProviderBase::Image,
                          QQmlImageProviderBase::ForceAsynchronousImageLoading)
{
    //QSqlDatabase db;

    if(!QSqlDatabase::connectionNames().contains(UePosDatabase::UeDatabaseConnectionNames::DATABASE_CONNECTION_NAME_PEOPLE,
                                                 Qt::CaseInsensitive))
    {
        this->ueSetDatabase(QSqlDatabase::addDatabase(UePosDatabase::DATABASE_DRIVER,
                                                      UePosDatabase::UeDatabaseConnectionNames::DATABASE_CONNECTION_NAME_PEOPLE));
    }   // if

    this->ueDatabase().setHostName(/*this->uePosSettings()->ueDbHostname()*/UePosDatabase::UeDatabaseConnectionParameters::DATABASE_HOSTNAME);
    this->ueDatabase().setDatabaseName(/*this->uePosSettings()->ueDbName()*/UePosDatabase::UeDatabaseConnectionParameters::DATABASE_NAME);
    this->ueDatabase().setUserName(/*this->uePosSettings()->ueDbUser()*/UePosDatabase::UeDatabaseConnectionParameters::DATABASE_USERNAME);
    this->ueDatabase().setPassword(/*this->uePosSettings()->ueDbPassword()*/UePosDatabase::UeDatabaseConnectionParameters::DATABASE_PASSWORD);

    if(this->ueDatabase().open())
    {
        this->setQuery(UePosDatabase::UeSqlQueries::UeTablePeople::SQL_QUERY_GET_ALL_PEOPLE,
                       this->ueDatabase());
        //qDebug() << this->ueDatabase().lastError().text();
    }
    else
    {
        qDebug() << this->ueDatabase().lastError().text();
    }
}   // default constructor

UePeopleModel::~UePeopleModel()
{
}   // default destructor

QVariant UePeopleModel::data(const QModelIndex &index,
                             int role) const
{
    QVariant value=QVariant();

    switch(role)
    {
        case ueRoleImage:
        {
//            qDebug() << "Row count: " << this->rowCount(QModelIndex());
//            qDebug() << "Column count: " << this->columnCount(QModelIndex());
//            qDebug() << "Role names: " << this->roleNames();
//            for(int iIndex=0; iIndex<this->record().count(); iIndex++)
//            {
//                qDebug() << "" << this->record(iIndex).value(0);
//            }   // for

//            qDebug() << "this->record(index.column()): " << this->record(index.column());
//            qDebug() << "this->record(index.row()): " << this->record(index.row());
//            qDebug() << this->record().count();
//            for(int iIndex=0; iIndex<this->record().count(); iIndex++)
//            {
//                qDebug() << this->record().fieldName(iIndex) << " ";
//                qDebug() << this->record().value(iIndex) << " ";
//                qDebug() << index.row() << " ";
//            }   // for
//            qDebug() << "this->record(index.column()): " << this->record(index.column());
            value=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_IMAGE).toByteArray();

            break;
        }   // case

        case ueRoleName:
        {
            value=this->record(index.row()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_NAME).toString();

            break;
        }   // case

        default:
            return value;
    }   // switch

    return value;
}   // data

QImage UePeopleModel::ueImage(const QString &id) const
{
    return QImage::fromData(this->record(id.toInt()).value(UePosDatabase::UeTableIndexes::UeTablePeople::INDEX_IMAGE).toByteArray(),
                            "PNG");
}   // image

QImage UePeopleModel::requestImage(const QString &id,
                                   QSize *size,
                                   const QSize &requestedSize)
{
    Q_UNUSED(requestedSize);

    QImage image=this->ueImage(id);

    *size = image.size();

    return image;
}   // requestImage

UeTypeRoles UePeopleModel::roleNames() const
{
    UeTypeRoles roles;
    const int iRoleName=UePeopleModel::ueRoleName;
    const int iRoleImage=UePeopleModel::ueRoleImage;

    roles.insert(iRoleName,
                 "ueRoleName");
    roles.insert(iRoleImage,
                 "ueRoleImage");

    return roles;
}   // roleNames

Torej, stvar se poveze na mysql bazo brez tezav, povezava je up and running (preveril s strani phpmyadmin najmanj 5x), QSqlDatabase razred je (to se nanasa na memberja, ki predstavlja povezavo na podatkovno bazo, torej, QSqlDatabase m_ueDb; explicitly shared, zato mi metoda QSqlDatabase ueDatabase() const ne vraca kopije. Torej, fora je v tem, da v metodi data() nonstop dobivam prazne vrednosti (baza JE POLNA), imena columnov zazeljene tabele tudi dobim, vendar vrednosti nikakor. Zakaj?! S tem se ubadam ze par dni in vem, da je neka neumna napaka, vendar sem ze na meji obupa in enostavno vec ne vem, kaj naj storim; prosim za pomoc!

Lp,
Marko

KernelPanic ::

Nihce ne ve, v cem je problem?! Mater, potem sem pa res v slepi ulici ... 8-O

Randomness ::

Po mojem se nobenemu ne ljubi (oz. nima časa) poglobiti v tvoj problem. En nasvet; več možnosti, da ti bo kdo pripravljen pomagati, boš imel, če boš posredoval link (npr. github) do minimalnega prevedljivega primera, v katerem boš pokazal, kje je težava.

windigo ::

Iz tvojega primera ni jasno, od kod dobiš QModelIndex in ti zato nihče ne more odgovoriti v čem je problem. Zadeva se obnaša tako kot naj bi se, če recimo iskana vrstica (index->row()) v podatkih ne obstaja.

KernelPanic ::

windigo je izjavil:

Iz tvojega primera ni jasno, od kod dobiš QModelIndex in ti zato nihče ne more odgovoriti v čem je problem. Zadeva se obnaša tako kot naj bi se, če recimo iskana vrstica (index->row()) v podatkih ne obstaja.

QModelIndex je parameter od virtualne metode data(). Zakomentirani stavki qDebug javijo column names in vse ostalo, vendar vrednosti so prazne.

windigo ::

Imaš talent za razlaganje očitnega. Kako kreiraš ta index, preden kličeš data(...)?

KernelPanic ::

windigo je izjavil:

Imaš talent za razlaganje očitnega. Kako kreiraš ta index, preden kličeš data(...)?
Ja, sorry mas prav glede talenta, nekaj drugega se delam vzporedno, se opravicujem. Uglavnem, ta koda je del QML aplikacije, class se exportira v QML in na bazo se poveze. SQL stavek izvedem, ni napake (iz phpmyadmin naprimer) in ven dobim podatke. Ko pa SQL stavek prozim iz aplikacije, dobim imena fieldov ter prazne vrednosti. Torej, ko pridem v data() je index ze kreiran, preko njega dobim imena fieldov, vrednosti pa ne:
"ID"
QVariant(QString, "")
0
"NAME"
QVariant(QString, "")
0
"APPPASSWORD"
QVariant(QString, "")
0
"CARD"
QVariant(QString, "")
0
"ROLE"
QVariant(QString, "")
0
"VISIBLE"
QVariant(QString, "")
0
"IMAGE"
QVariant(QByteArray, "")
0
"ID"
QVariant(QString, "")
1
"NAME"
QVariant(QString, "")
1
"APPPASSWORD"
QVariant(QString, "")
1
"CARD"
QVariant(QString, "")
1
"ROLE"
QVariant(QString, "")
1
"VISIBLE"
QVariant(QString, "")
1
"IMAGE"
QVariant(QByteArray, "")
1
"ID"
QVariant(QString, "")
2
"NAME"
QVariant(QString, "")
2
"APPPASSWORD"
QVariant(QString, "")
2
"CARD"
QVariant(QString, "")
2
"ROLE"
QVariant(QString, "")
2
"VISIBLE"
QVariant(QString, "")
2
"IMAGE"
QVariant(QByteArray, "")
2
"ID"
QVariant(QString, "")
3
"NAME"
QVariant(QString, "")
3
"APPPASSWORD"
QVariant(QString, "")
3
"CARD"
QVariant(QString, "")
3
"ROLE"
QVariant(QString, "")
3
"VISIBLE"
QVariant(QString, "")
3
"IMAGE"
QVariant(QByteArray, "")
3
"ID"
QVariant(QString, "")
4
"NAME"
QVariant(QString, "")
4
"APPPASSWORD"
QVariant(QString, "")
4
"CARD"
QVariant(QString, "")
4
"ROLE"
QVariant(QString, "")
4
"VISIBLE"
QVariant(QString, "")
4
"IMAGE"
QVariant(QByteArray, "")
4

Ta razred je bil ze uporabljen v prejsnjih aplikacijah in je delal brez problemov. Je pa res, da je baza na hostingu, je mogoce, da je kaj z pravicami narobe?!

windigo ::

Ok, bom probal še enkrat narisati, če napisati ni dovolj:

Od kod dobi tvoj QModelIndex parameter index vrednost row(), ki jo uporabljaš v klicu funkcije data()?

Ta običajno ni 0, da bi ti data() iz podatkov vrnila vedno prvo vrstico, če ta obstaja. Kako torej točno kreiraš QModelIndex?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Qt/C++]problem z Undefined reference na konstanti znotraj razreda

Oddelek: Programiranje
102338 (2008) phantom
»

[C++Qt] libs, style-sheet in opravilna vrstica

Oddelek: Programiranje
101248 (1157) 'FireSTORM'
»

[C++-Qt] QDateTime v LocalDate in LocalTime formatu

Oddelek: Programiranje
101182 (1074) 'FireSTORM'
»

[VB2005PRO]Database

Oddelek: Programiranje
91012 (948) darkolord
»

[ OOP ] Global vs. Not Global

Oddelek: Programiranje
141241 (1036) noraguta

Več podobnih tem