s
Feb. 5, 2020, 12:23 a.m.

QTableView и добавление иконки в строку.

QTableView

Доброго времени суток.
Есть форма на которой присутствует tableView - выводится список документов.
Хочу реализовать в tableView вывод иконки в зависимости от состояния документа (записан, проведен).

    model = new QSqlQueryModel;
    qry   = new QSqlQuery(db->getDB());

    if (db->getDB().open()){
        qry->prepare("SELECT docExamen.id,"
                     "docExamen.post,"
                     "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
                     "docExamen.number,"
                     "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
                     "docExamen.ticket,"
                     "users.name as Autor,"
                     "docExamen.comment FROM docExamen "
                     "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
                     "INNER JOIN users ON docExamen.id_users = users.id;");
        if (qry->exec()){

            //****************************************
            /* ... реализовать добавление иконки ... */
            QList<QStandardItem *> items;

            while (qry->next()) {
                if (qry->value(1).toInt() == 1){ // doc->post
                    items.append(new QStandardItem(QIcon(":rec/img/doc_post_x32.png"), qry->value(1).toString()));

                } else { // doc->write
                    items.append(new QStandardItem(QIcon(":rec/img/doc_write_x32.png"), qry->value(1).toString()));
                }
            }
            /* ... реализовать добавление иконки ... */
            //****************************************

            model->setQuery(*qry);
            ui->tableView->setModel(model);

        } else {
            qDebug() << "Solicitarea nereusita !!!" << endl << "Eroarea: " + qry->lastError().text();
        }
    }


    //decorarea tabelului
    ui->tableView->hideColumn(0);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

Вопросы:
1.Как правильно реализовать вывод иконки.
2.Заглядывая на будущее сортировка по столбцам (насколько я понимаю использовать QSortFilterProxyModel, но как из QSqlQueryModel в QSortFilterProxyModel)

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
3
  • Feb. 5, 2020, 6:04 a.m.
  • The answer was marked as a solution.

Добрый день, уважаемый Shuric.

Вот похожий пример для Вас Пример . Вам нужно использовать делегаты, я так понимаю.
Я бы помог Вам еще больше, но к сожалению сам только учусь этому.

s

Добрый день. Спасибо за наведение примера, но для меня не подходит.
Делегат необходим (насколько я понимаю) для редактирования в модели, а мне необходимо было переопределить методы представления модели QSqlQueryModel
Для кого интересно решил следующим образом:
- проблема в колонки post переопределить метод представления

basesqlquerymodel.h

#ifndef BASESQLQUERYMODEL_H
#define BASESQLQUERYMODEL_H

#include <QObject>
#include <QSqlQuery>
#include <QSqlQueryModel>

class BaseSqlQueryModel : public QSqlQueryModel
{
    Q_OBJECT

public:

    explicit BaseSqlQueryModel(QString &strQuery, QObject *parent = nullptr);
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const override;
    virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;

};

#endif // BASESQLQUERYMODEL_H

basesqlquerymodel.cpp

#include "basesqlquerymodel.h"
#include <QIcon>

BaseSqlQueryModel::BaseSqlQueryModel(QString &strQuery, QObject *parent): QSqlQueryModel(parent)
{
    QSqlQuery query;
    query.prepare(strQuery);
    query.exec();

    //setam solicitarea in model
    QSqlQueryModel::setQuery(query);

}

int BaseSqlQueryModel::rowCount(const QModelIndex &parent) const
{
    return QSqlQueryModel::rowCount(parent);
}

int BaseSqlQueryModel::columnCount(const QModelIndex &parent) const
{
    return QSqlQueryModel::columnCount(parent);
}

QVariant BaseSqlQueryModel::data(const QModelIndex &item, int role) const
{
    QVariant result;

    /* item.column() =
     * 0 - index
     * 1 - post */
    if( item.column() == 1 ){
        switch(role)
        {
        case Qt::UserRole:
            return QSqlQueryModel::data(item, Qt::UserRole);
        case Qt::DisplayRole:
//            return QSqlQueryModel::data(item, Qt::DisplayRole);
        case Qt::DecorationRole:
            if (QSqlQueryModel::data(item, Qt::DisplayRole).toInt() == 1){
                return QIcon(":rec/img/doc_post_x32.png");
            } else {
                return QIcon(":rec/img/doc_write_x32.png");
            }
        default:
            break;
        }
    } else {
        switch(role)
        {
        case Qt::UserRole:
            return QSqlQueryModel::data(item, Qt::UserRole);
        case Qt::DisplayRole:
            return QSqlQueryModel::data(item, Qt::DisplayRole);
        default:
            break;
        }
    }

    return result;
}

bool BaseSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
{
    return QSqlQueryModel::setHeaderData(section, orientation, value, role);
}

В listdocexamen.cpp реализовал:

    QString strQuery = "SELECT docExamen.id,"
                       "docExamen.post,"
                       "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
                       "docExamen.number,"
                       "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
                       "docExamen.ticket,"
                       "users.name as Autor,"
                       "docExamen.comment FROM docExamen "
                       "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
                       "INNER JOIN users ON docExamen.id_users = users.id;";
    auto model = new BaseSqlQueryModel(strQuery, this);
    ui->tableView->setModel(model);

    //decorarea tabelului
    ui->tableView->hideColumn(0);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    //Denumirile coloanelor
    model->setHeaderData(1, Qt::Horizontal, tr(""));
    model->setHeaderData(2, Qt::Horizontal, tr("Data"));
    model->setHeaderData(3, Qt::Horizontal, tr("Numar"));
    model->setHeaderData(4, Qt::Horizontal, tr("NPP pacientului"));
    model->setHeaderData(5, Qt::Horizontal, tr("Nr.tichetului"));
    model->setHeaderData(6, Qt::Horizontal, tr("Autor"));
    model->setHeaderData(7, Qt::Horizontal, tr("Comentariu"));

В результате вышло следующее:

Правда иконки не очень, но главное результат.
Сейчас, понимаю что изначально был задан вопрос не корректно. Приношу свои извинения.

s
  • Feb. 8, 2020, 12:07 a.m.
  • (edited)

Доброго времени суток.
По поводу второго вопроса - сортировка по столбцам.
Реализовал следующим образом:
listdocexamen.cpp

    QString strQuery = "SELECT docExamen.id,"
                       "docExamen.post,"
                       "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
                       "docExamen.number,"
                       "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
                       "docExamen.ticket,"
                       "users.name as Autor,"
                       "docExamen.comment FROM docExamen "
                       "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
                       "INNER JOIN users ON docExamen.id_users = users.id;";
    auto model = new BaseSqlQueryModel(strQuery, this);

    QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this);
    proxy->setSourceModel(model);
    ui->tableView->setModel(proxy);

Возникла проблема с сортировкой по столбцу Date . Понял что проблема в запросе, изменил на

    QString strQuery = "SELECT docExamen.id,"
                       "docExamen.post,"
                       "docExamen.date,"
                       "docExamen.number,"
                       "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
                       "docExamen.ticket,"
                       "users.name as Autor,"
                       "docExamen.comment FROM docExamen "
                       "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
                       "INNER JOIN users ON docExamen.id_users = users.id;";

сортировка отрабатывается отлично,

но как привести значение yyyy-MM-dd HH-MM-ss в dd-MM-yyy hh-mm-ss ?
basesqlquerymodel.cpp

QVariant BaseSqlQueryModel::data(const QModelIndex &item, int role) const
{
    QVariant result;

    /* item.column() =
     * 0 - index
     * 1 - post 
     * 2 - date */
    if( item.column() == 1 ){
        switch(role)
        {
        case Qt::UserRole:
            return QSqlQueryModel::data(item, Qt::UserRole);
        case Qt::DisplayRole:
//            return QSqlQueryModel::data(item, Qt::DisplayRole);
        case Qt::DecorationRole:
            if (QSqlQueryModel::data(item, Qt::DisplayRole).toInt() == 1){
                return QIcon(":rec/img/document_valid_x32.png");
            } else {
                return QIcon(":rec/img/document_write_x32.png");
            }
        default:
            break;
        }
    } else if (item.column() == 2){//Date
        switch(role)
        {
        case Qt::UserRole:
            return QSqlQueryModel::data(item, Qt::UserRole);
        case Qt::DisplayRole:
            return QSqlQueryModel::data(item, Qt::DisplayRole); //*** !!!??? ****
        }
    } else {
        switch(role)
        {
        case Qt::UserRole:
            return QSqlQueryModel::data(item, Qt::UserRole);
        case Qt::DisplayRole:
            return QSqlQueryModel::data(item, Qt::DisplayRole);
        default:
            break;
        }
    }

    return result;
}

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

a
Feb. 25, 2020, 5:40 a.m.
ayb

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
DZ
Feb. 24, 2020, 2:47 p.m.
Dmitrij Zlobin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:40points,
  • Rating points-8
p
Feb. 17, 2020, 2:41 p.m.
pstMem

C++ - Тест 003. Условия и циклы

  • Result:85points,
  • Rating points6
Last comments
Feb. 24, 2020, 3:54 a.m.
Evgenij Legotskoj

Добрый день. Там будет url, на который указывает ссылка тега a в пагинаторе, если правильно помню )) Написал этот код и забыл.
B
Feb. 24, 2020, 12:37 a.m.
BahaMeirman

Евгений Здравствуйте! Не могу понять вот эту часть кода: url: jQuery(this).attr('action') наверное здесь должен быть путь к url, тогда 'action' на какой url указывает?
Feb. 17, 2020, 3:22 a.m.
Evgenij Legotskoj

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
Feb. 16, 2020, 1:36 p.m.
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Now discuss on the forum
a
Feb. 25, 2020, 8:06 a.m.
ayb

Да
Feb. 24, 2020, 12:04 p.m.
Evgenij Legotskoj

Добрый день. Вот пример с дружественного ресурса с движением камеры
Feb. 24, 2020, 6:29 a.m.
Evgenij Legotskoj

Qt не предоставляет функционала по запросу root прав во время выполнения программы. Поэтому нужно использовать платформозависимый функционал, для Linux это будет выглядеть так: #include…
Feb. 24, 2020, 3:47 a.m.
Evgenij Legotskoj

Добрый день. Что означает клиентская область? Это изображение? Вам нужно распознавать символы текста или всё-таки пользователь будет вводить текст с клавиатуры, просто в любом месте "абстр…
VZ
Feb. 21, 2020, 5:19 a.m.
Vladimir Zhitkovsky

void sendImage(int sessid, int type, int dest, int format, QString imgBase64Data){ QNetworkRequest request; request.setUrl(QUrl(ipAddress + "ctlapi/cmd=preparereportimg&sessid=…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB