s
5 февраля 2020 г. 0:23

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)

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
3
  • 5 февраля 2020 г. 6:04
  • Ответ был помечен как решение.

Добрый день, уважаемый 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
  • 8 февраля 2020 г. 0:07
  • (ред.)

Доброго времени суток.
По поводу второго вопроса - сортировка по столбцам.
Реализовал следующим образом:
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;
}

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

p
17 февраля 2020 г. 14:41
pstMem

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

  • Результат:85баллов,
  • Очки рейтинга6
z
17 февраля 2020 г. 6:02
zet

C++ - Тест 006. Перечисления

  • Результат:80баллов,
  • Очки рейтинга4
z
17 февраля 2020 г. 5:49
zet

C++ - Тест 001. Первая программа и типы данных

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
24 февраля 2020 г. 3:54
Евгений Легоцкой

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

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

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

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Сейчас обсуждают на форуме
24 февраля 2020 г. 6:29
Евгений Легоцкой

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

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

void sendImage(int sessid, int type, int dest, int format, QString imgBase64Data){ QNetworkRequest request; request.setUrl(QUrl(ipAddress + "ctlapi/cmd=preparereportimg&sessid=…
20 февраля 2020 г. 14:40
mkdir

Здравствуйте! Пишу игру - 2D платформер в среде Qt. Имею не очень много опыта в разработке. Подскажите, как можно реализовать ситуацию, где QGraphicScene больше, чем QGraphicView и надо двигать …
20 февраля 2020 г. 7:12
Михаиллл

Вот так похоже можно https://doc.qt.io/qt-5/qtpurchasing-index.html
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB