AC
Alexandru Codreanu05 лютого 2020 р. 00: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
  • 05 лютого 2020 р. 06:04
  • Відповідь була позначена як рішення.

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

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

    AC
    • 06 лютого 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
      • 08 лютого 2020 р. 00: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;
      }
      

        Коментарі

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

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

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

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

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

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

        • Результат:20бали,
        • Рейтинг балів-10
        Останні коментарі
        ИМ
        Игорь Максимов22 листопада 2024 р. 11:51
        Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 жовтня 2024 р. 14:37
        Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 жовтня 2024 р. 08:19
        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов05 жовтня 2024 р. 07:51
        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas505 липня 2024 р. 11:02
        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Тепер обговоріть на форумі
        Evgenii Legotckoi
        Evgenii Legotckoi24 червня 2024 р. 15:11
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey115 листопада 2024 р. 06:04
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProject04 червня 2022 р. 03:49
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
        9
        9Anonim25 жовтня 2024 р. 09:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Слідкуйте за нами в соціальних мережах