AC
5 февраля 2020 г. 11:23

QTableView и добавление иконки в строку.

QTableView

Доброго времени суток.
Есть форма на которой присутствует tableView - выводится список документов.
Хочу реализовать в tableView вывод иконки в зависимости от состояния документа (записан, проведен).

  1. model = new QSqlQueryModel;
  2. qry = new QSqlQuery(db->getDB());
  3.  
  4. if (db->getDB().open()){
  5. qry->prepare("SELECT docExamen.id,"
  6. "docExamen.post,"
  7. "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
  8. "docExamen.number,"
  9. "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
  10. "docExamen.ticket,"
  11. "users.name as Autor,"
  12. "docExamen.comment FROM docExamen "
  13. "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
  14. "INNER JOIN users ON docExamen.id_users = users.id;");
  15. if (qry->exec()){
  16.  
  17. //****************************************
  18. /* ... реализовать добавление иконки ... */
  19. QList<QStandardItem *> items;
  20.  
  21. while (qry->next()) {
  22. if (qry->value(1).toInt() == 1){ // doc->post
  23. items.append(new QStandardItem(QIcon(":rec/img/doc_post_x32.png"), qry->value(1).toString()));
  24.  
  25. } else { // doc->write
  26. items.append(new QStandardItem(QIcon(":rec/img/doc_write_x32.png"), qry->value(1).toString()));
  27. }
  28. }
  29. /* ... реализовать добавление иконки ... */
  30. //****************************************
  31.  
  32. model->setQuery(*qry);
  33. ui->tableView->setModel(model);
  34.  
  35. } else {
  36. qDebug() << "Solicitarea nereusita !!!" << endl << "Eroarea: " + qry->lastError().text();
  37. }
  38. }
  39.  
  40.  
  41. //decorarea tabelului
  42. ui->tableView->hideColumn(0);
  43. ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
  44. ui->tableView->horizontalHeader()->setStretchLastSection(true);
  45.  
  46. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

Вопросы:
1.Как правильно реализовать вывод иконки.
2.Заглядывая на будущее сортировка по столбцам (насколько я понимаю использовать QSortFilterProxyModel, но как из QSqlQueryModel в QSortFilterProxyModel)

3

Вам это нравится? Поделитесь в социальных сетях!

3
Intruder
  • 5 февраля 2020 г. 17:04
  • Ответ был помечен как решение.

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

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

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

    Добрый день. Спасибо за наведение примера, но для меня не подходит.
    Делегат необходим (насколько я понимаю) для редактирования в модели, а мне необходимо было переопределить методы представления модели QSqlQueryModel
    Для кого интересно решил следующим образом:
    - проблема в колонки post переопределить метод представления

    basesqlquerymodel.h

    1. #ifndef BASESQLQUERYMODEL_H
    2. #define BASESQLQUERYMODEL_H
    3.  
    4. #include <QObject>
    5. #include <QSqlQuery>
    6. #include <QSqlQueryModel>
    7.  
    8. class BaseSqlQueryModel : public QSqlQueryModel
    9. {
    10. Q_OBJECT
    11.  
    12. public:
    13.  
    14. explicit BaseSqlQueryModel(QString &strQuery, QObject *parent = nullptr);
    15. virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    16. virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    17. virtual QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const override;
    18. virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
    19.  
    20. };
    21.  
    22. #endif // BASESQLQUERYMODEL_H

    basesqlquerymodel.cpp

    1. #include "basesqlquerymodel.h"
    2. #include <QIcon>
    3.  
    4. BaseSqlQueryModel::BaseSqlQueryModel(QString &strQuery, QObject *parent): QSqlQueryModel(parent)
    5. {
    6. QSqlQuery query;
    7. query.prepare(strQuery);
    8. query.exec();
    9.  
    10. //setam solicitarea in model
    11. QSqlQueryModel::setQuery(query);
    12.  
    13. }
    14.  
    15. int BaseSqlQueryModel::rowCount(const QModelIndex &parent) const
    16. {
    17. return QSqlQueryModel::rowCount(parent);
    18. }
    19.  
    20. int BaseSqlQueryModel::columnCount(const QModelIndex &parent) const
    21. {
    22. return QSqlQueryModel::columnCount(parent);
    23. }
    24.  
    25. QVariant BaseSqlQueryModel::data(const QModelIndex &item, int role) const
    26. {
    27. QVariant result;
    28.  
    29. /* item.column() =
    30. * 0 - index
    31. * 1 - post */
    32. if( item.column() == 1 ){
    33. switch(role)
    34. {
    35. case Qt::UserRole:
    36. return QSqlQueryModel::data(item, Qt::UserRole);
    37. case Qt::DisplayRole:
    38. // return QSqlQueryModel::data(item, Qt::DisplayRole);
    39. case Qt::DecorationRole:
    40. if (QSqlQueryModel::data(item, Qt::DisplayRole).toInt() == 1){
    41. return QIcon(":rec/img/doc_post_x32.png");
    42. } else {
    43. return QIcon(":rec/img/doc_write_x32.png");
    44. }
    45. default:
    46. break;
    47. }
    48. } else {
    49. switch(role)
    50. {
    51. case Qt::UserRole:
    52. return QSqlQueryModel::data(item, Qt::UserRole);
    53. case Qt::DisplayRole:
    54. return QSqlQueryModel::data(item, Qt::DisplayRole);
    55. default:
    56. break;
    57. }
    58. }
    59.  
    60. return result;
    61. }
    62.  
    63. bool BaseSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
    64. {
    65. return QSqlQueryModel::setHeaderData(section, orientation, value, role);
    66. }

    В listdocexamen.cpp реализовал:

    1. QString strQuery = "SELECT docExamen.id,"
    2. "docExamen.post,"
    3. "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
    4. "docExamen.number,"
    5. "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
    6. "docExamen.ticket,"
    7. "users.name as Autor,"
    8. "docExamen.comment FROM docExamen "
    9. "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
    10. "INNER JOIN users ON docExamen.id_users = users.id;";
    11. auto model = new BaseSqlQueryModel(strQuery, this);
    12. ui->tableView->setModel(model);
    13.  
    14. //decorarea tabelului
    15. ui->tableView->hideColumn(0);
    16. ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    17. ui->tableView->horizontalHeader()->setStretchLastSection(true);
    18.  
    19. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    20.  
    21. //Denumirile coloanelor
    22. model->setHeaderData(1, Qt::Horizontal, tr(""));
    23. model->setHeaderData(2, Qt::Horizontal, tr("Data"));
    24. model->setHeaderData(3, Qt::Horizontal, tr("Numar"));
    25. model->setHeaderData(4, Qt::Horizontal, tr("NPP pacientului"));
    26. model->setHeaderData(5, Qt::Horizontal, tr("Nr.tichetului"));
    27. model->setHeaderData(6, Qt::Horizontal, tr("Autor"));
    28. model->setHeaderData(7, Qt::Horizontal, tr("Comentariu"));

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

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

      AC
      • 8 февраля 2020 г. 11:07
      • (ред.)

      Доброго времени суток.
      По поводу второго вопроса - сортировка по столбцам.
      Реализовал следующим образом:
      listdocexamen.cpp

      1. QString strQuery = "SELECT docExamen.id,"
      2. "docExamen.post,"
      3. "substr(docExamen.date, 9, 2) ||'.'|| substr(docExamen.date, 6, 2) ||'.'|| substr(docExamen.date, 0, 5) ||' '|| substr(docExamen.date, 11) as Date,"
      4. "docExamen.number,"
      5. "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
      6. "docExamen.ticket,"
      7. "users.name as Autor,"
      8. "docExamen.comment FROM docExamen "
      9. "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
      10. "INNER JOIN users ON docExamen.id_users = users.id;";
      11. auto model = new BaseSqlQueryModel(strQuery, this);
      12.  
      13. QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this);
      14. proxy->setSourceModel(model);
      15. ui->tableView->setModel(proxy);

      Возникла проблема с сортировкой по столбцу Date . Понял что проблема в запросе, изменил на

      1. QString strQuery = "SELECT docExamen.id,"
      2. "docExamen.post,"
      3. "docExamen.date,"
      4. "docExamen.number,"
      5. "pacients.name ||' '|| pacients.fName ||' '|| pacients.mName||' '|| substr(pacients.birthday, 9, 2) ||'.'|| substr(pacients.birthday, 6, 2) ||'.'|| substr(pacients.birthday, 1, 4) as NamePacient,"
      6. "docExamen.ticket,"
      7. "users.name as Autor,"
      8. "docExamen.comment FROM docExamen "
      9. "INNER JOIN pacients ON docExamen.id_pacients = pacients.id "
      10. "INNER JOIN users ON docExamen.id_users = users.id;";

      сортировка отрабатывается отлично,

      но как привести значение yyyy-MM-dd HH-MM-ss в dd-MM-yyy hh-mm-ss ?
      basesqlquerymodel.cpp

      1. QVariant BaseSqlQueryModel::data(const QModelIndex &item, int role) const
      2. {
      3. QVariant result;
      4.  
      5. /* item.column() =
      6. * 0 - index
      7. * 1 - post
      8. * 2 - date */
      9. if( item.column() == 1 ){
      10. switch(role)
      11. {
      12. case Qt::UserRole:
      13. return QSqlQueryModel::data(item, Qt::UserRole);
      14. case Qt::DisplayRole:
      15. // return QSqlQueryModel::data(item, Qt::DisplayRole);
      16. case Qt::DecorationRole:
      17. if (QSqlQueryModel::data(item, Qt::DisplayRole).toInt() == 1){
      18. return QIcon(":rec/img/document_valid_x32.png");
      19. } else {
      20. return QIcon(":rec/img/document_write_x32.png");
      21. }
      22. default:
      23. break;
      24. }
      25. } else if (item.column() == 2){//Date
      26. switch(role)
      27. {
      28. case Qt::UserRole:
      29. return QSqlQueryModel::data(item, Qt::UserRole);
      30. case Qt::DisplayRole:
      31. return QSqlQueryModel::data(item, Qt::DisplayRole); //*** !!!??? ****
      32. }
      33. } else {
      34. switch(role)
      35. {
      36. case Qt::UserRole:
      37. return QSqlQueryModel::data(item, Qt::UserRole);
      38. case Qt::DisplayRole:
      39. return QSqlQueryModel::data(item, Qt::DisplayRole);
      40. default:
      41. break;
      42. }
      43. }
      44.  
      45. return result;
      46. }

        Комментарии

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