• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Wysjanienie kodu [QT]

Object Storage Arubacloud
–1 głos
149 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
zamknięte 2 stycznia 2019 przez DragonCoder

Witam, czy moglby mi ktos wyjasnic dzialanie kodu, to znaczy w paru miejscach nie wiem, co on wykonuje. Tam gdzie ni wiem, zostawie kod bez komentarza:

#ifndef SQLQUERYMODEL_H
#define SQLQUERYMODEL_H

#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlRecord>

//zdefiniowalismy plik naglowkowy .h i dolaczylismy do niego 3 bilbioteki

class SqlQueryModel : public QSqlQueryModel //Tworze klase, ktora dziedziczy od klasy QSqlQueryModel
{
    Q_OBJECT //Macro, dzieki ktoremu klasa moze uzyac sygnalow
    Q_PROPERTY(QString query READ queryStr WRITE setQueryStr NOTIFY queryStrChanged)
    Q_PROPERTY(QStringList userRoleNames READ userRoleNames CONSTANT)
public:
    using QSqlQueryModel::QSqlQueryModel;
    QHash<int, QByteArray> roleNames() const
    {
        QHash<int, QByteArray> roles;
        for (int i = 0; i < record().count(); i ++) {
            roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
        }
        return roles;
    }
    QVariant data(const QModelIndex &index, int role) const
    {
        QVariant value;
        if (index.isValid()) {
            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;
    }
    QString queryStr() const{
        return query().lastQuery(); //zwaacam ostatni query
    }
    void setQueryStr(const QString &query){
        if(queryStr() == query)
            return;
        setQuery(query);
        emit queryStrChanged(); //wysylanie query do bazy danych
    }
    QStringList userRoleNames() const {
        QStringList names;
        for (int i = 0; i < record().count(); i ++) {
            names << record().fieldName(i).toUtf8();
        }
        return names;
    } //pobieranie rekordow z bazy danych  dodawanie ich do listy
signals:
    void queryStrChanged();
};
#endif // SQLQUERYMODEL_H

I tych 2 rzeczy, tzn QHash i QVariant, nie jestem pewien, co one dokladnie robia, a chcialbym to w pelni zrozumiec, dziekuje za pomoc

Pozdrawiam DC

komentarz zamknięcia: Wyjasnienie nizej

1 odpowiedź

+2 głosów
odpowiedź 2 stycznia 2019 przez Bondrusiek Maniak (61,410 p.)
wybrane 2 stycznia 2019 przez DragonCoder
 
Najlepsza

Witam,

funkcja

    QHash<int, QByteArray> roleNames() const
    {
        QHash<int, QByteArray> roles;
        for (int i = 0; i < record().count(); i ++) {
            roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
        }
        return roles;
    }

zwraca role dla modelu. Wartość Qt::UserRole jest przeznaczona dla użytkownika. Dzięki inkrementacji możesz tworzyć własne role. Wartości mniejsze już są zdefiniowane np. Qt::DisplayRole , Qt::DecorationRole lub Qt::EditRole.

    QVariant data(const QModelIndex &index, int role) const
    {
        QVariant value;
        if (index.isValid()) {
            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;
    }

Jest to funkcja która zwraca wartość z komórki na którą wskazuje QModelIndex oraz przypisaną role. Najczęstszą rolą jest Qt::DisplayRole, która reprezentuje widoczną wartość np w tabeli. QModelIndex jest inteligentnym wskaźnikiem. QVariant jest unią która można być rzutowana na większość typów z Qt(jak QString, QDate, bool). Twoje dwie funkcje są wirtualne i ty przeładowujesz w klasie SqlQueryModel do własnych potrzeb.

Więcej info:

http://doc.qt.io/qt-5/qsqlquerymodel.html#record-1

PS.

Pisze się Qt nie QT.

komentarz 2 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Dziekuje za odpowiedz, nie wiem czemu, ale jakos zapamietalem to jako QT, a nie Qt, ale juz zapamietam jak to sie poprawnie pisze

Podobne pytania

0 głosów
2 odpowiedzi 683 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 99 wizyt
+1 głos
0 odpowiedzi 138 wizyt

92,759 zapytań

141,682 odpowiedzi

320,458 komentarzy

62,104 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...