Forum » Programiranje » 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:
ter njegova implementacija:
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
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
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 ::
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.
KernelPanic ::
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?
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Qt/C++]problem z Undefined reference na konstanti znotraj razredaOddelek: Programiranje | 2343 (2013) | phantom |
» | [C++Qt] libs, style-sheet in opravilna vrsticaOddelek: Programiranje | 1248 (1157) | 'FireSTORM' |
» | [C++-Qt] QDateTime v LocalDate in LocalTime formatuOddelek: Programiranje | 1183 (1075) | 'FireSTORM' |
» | [VB2005PRO]DatabaseOddelek: Programiranje | 1012 (948) | darkolord |
» | [ OOP ] Global vs. Not GlobalOddelek: Programiranje | 1241 (1036) | noraguta |