AC
Alexandru Codreanu5 февраля 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
Intruder
  • 5 февраля 2020 г. 6:04
  • Ответ был помечен как решение.

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

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

    AC
    • 6 февраля 2020 г. 16:06
    • (ред.)

    Добрый день. Спасибо за наведение примера, но для меня не подходит.
    Делегат необходим (насколько я понимаю) для редактирования в модели, а мне необходимо было переопределить методы представления модели 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"));
    

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

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

      AC
      • 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;
      }
      

        Комментарии

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

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:50баллов,
        • Очки рейтинга-4
        m
        • molni99
        • 26 октября 2024 г. 1:37

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:80баллов,
        • Очки рейтинга4
        m
        • molni99
        • 26 октября 2024 г. 1:29

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:20баллов,
        • Очки рейтинга-10
        Последние комментарии
        i
        innorwall11 ноября 2024 г. 22:12
        Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
        i
        innorwall11 ноября 2024 г. 18:23
        QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
        i
        innorwall11 ноября 2024 г. 15:50
        Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
        i
        innorwall11 ноября 2024 г. 14:19
        Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
        i
        innorwall11 ноября 2024 г. 13:55
        PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
        Сейчас обсуждают на форуме
        i
        innorwall11 ноября 2024 г. 20:56
        добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
        i
        innorwall11 ноября 2024 г. 10:55
        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
        9
        9Anonim25 октября 2024 г. 9:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
        ИМ
        Игорь Максимов3 октября 2024 г. 4:05
        Реализация навигации по разделам Спасибо Евгений!

        Следите за нами в социальных сетях