AC
Alexandru CodreanuFeb. 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.

Do you like it? Share on social networks!

3
Intruder
  • Feb. 5, 2020, 6:04 a.m.
  • The answer was marked as a solution.

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

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

    AC
    • Feb. 6, 2020, 4:06 p.m.
    • (edited)

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

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

        • Result:50points,
        • Rating points-4
        m

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

        • Result:80points,
        • Rating points4
        m

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

        • Result:20points,
        • Rating points-10
        Last comments
        i
        innorwallNov. 15, 2024, 3:03 a.m.
        Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
        i
        innorwallNov. 14, 2024, 8:07 p.m.
        Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
        i
        innorwallNov. 14, 2024, 7:42 p.m.
        How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
        i
        innorwallNov. 14, 2024, 5:09 p.m.
        Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
        i
        innorwallNov. 14, 2024, 12:05 p.m.
        EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
        Now discuss on the forum
        i
        innorwallNov. 14, 2024, 11:39 a.m.
        добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
        i
        innorwallNov. 11, 2024, 6:55 p.m.
        Всё ещё разбираюсь с кешем. 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
        9AnonimOct. 25, 2024, 4:10 p.m.
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Follow us in social networks