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

question-closed Wysjanienie kodu [QT]

Aruba Cloud - Virtual Private Server VPS
–1 głos
182 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,440 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 944 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 137 wizyt
+1 głos
0 odpowiedzi 158 wizyt

93,326 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,654 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...