AC
Alexandru CodreanuАқп. 5, 2020, 12: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, 4: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, 12: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
        Соңғы пікірлер
        ИМ
        Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
        Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
        Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas5Шілде 5, 2024, 11:02 Т.Ж.
        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Енді форумда талқылаңыз
        m
        moogoҚар. 22, 2024, 7:17 Т.Ж.
        Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
        Evgenii Legotckoi
        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProjectМаусым 4, 2022, 3:49 Т.Ж.
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

        Бізді әлеуметтік желілерде бақылаңыз