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

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз
        Г

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

        • Нәтиже:66ұпай,
        • Бағалау ұпайлары-1
        t

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

        • Нәтиже:33ұпай,
        • Бағалау ұпайлары-10
        t

        Qt - Тест 001. Сигналы и слоты

        • Нәтиже:52ұпай,
        • Бағалау ұпайлары-4
        Соңғы пікірлер
        G
        GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
        Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
        d
        dblas5Шілде 5, 2024, 11:02 Т.Ж.
        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        k
        kmssrАқп. 8, 2024, 6:43 Т.Қ.
        Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        АК
        Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
        Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        Енді форумда талқылаңыз
        Evgenii Legotckoi
        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        F
        FynjyШілде 22, 2024, 4:15 Т.Ж.
        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
        BlinCT
        BlinCTМаусым 25, 2024, 1 Т.Ж.
        Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
        BlinCT
        BlinCTМамыр 5, 2024, 5:46 Т.Ж.
        Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
        Evgenii Legotckoi
        Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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