Ruslan Polupan
9 апреля 2019 г. 19:30

QAbstarctTableModel, CheckBox в столбце.

QAbstractTableModel, qcheckbox

Доброго времени суток!

Отображение CheckBox Получилось организовать. Правда возник вопрос чтобы в ячейке отображался только он и по центру.
Но вот никак не пойму как сделать что бы выбирался Сheckboх.
Cовсем что-то запутался или где-то что-то не дочитал.
Буду благодарен за любой пинок в нужном направлении....


modelterminals.h

  1. #ifndef MODELTERMINALS_H
  2. #define MODELTERMINALS_H
  3.  
  4. #include "FuelNameWizard/terminals.h"
  5.  
  6. #include <QObject>
  7. #include <QAbstractTableModel>
  8.  
  9. class ModelTerminals : public QAbstractTableModel
  10. {
  11. Q_OBJECT
  12. QVector<Terminals> term;
  13. public:
  14. ModelTerminals(const QVector<Terminals> vek);
  15.  
  16. // QAbstractItemModel interface
  17. public:
  18. int rowCount(const QModelIndex &parent) const;
  19. int columnCount(const QModelIndex &parent) const;
  20. QVariant data(const QModelIndex &index, int role) const;
  21. QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  22.  
  23. // QAbstractItemModel interface
  24. public:
  25. Qt::ItemFlags flags(const QModelIndex &index) const;
  26.  
  27. // QAbstractItemModel interface
  28. public:
  29. bool setData(const QModelIndex &index, const QVariant &value, int role);
  30. };
  31.  
  32. #endif // MODELTERMINALS_H

modelterminals.cpp

  1. #include "modelterminals.h"
  2.  
  3. ModelTerminals::ModelTerminals(const QVector<Terminals> vek)
  4. {
  5. term = vek;
  6. }
  7.  
  8.  
  9. int ModelTerminals::rowCount(const QModelIndex &parent) const
  10. {
  11. return term.size();
  12. }
  13.  
  14. int ModelTerminals::columnCount(const QModelIndex &parent) const
  15. {
  16. Terminals *terminal = new Terminals();
  17. return terminal->colParam();
  18. }
  19.  
  20. QVariant ModelTerminals::data(const QModelIndex &index, int role) const
  21. {
  22. if ( !index.isValid() ) { return QVariant(); }
  23. Terminals t = term[index.row()];
  24. switch (role) {
  25. case Qt::DisplayRole:
  26. switch (index.column()) {
  27. case 0: return t.isCheked();
  28. case 1: return t.terminal();
  29. case 2: return t.name();
  30. case 3: return t.serverName();
  31. case 4: return t.database();
  32. case 5: return t.password();
  33. default: break;
  34. }
  35. break;
  36. case Qt::CheckStateRole:
  37. if(index.column() == 0)
  38. return (t.isCheked() != 0) ? Qt::Checked : Qt::Unchecked;
  39. break;
  40.  
  41. default:
  42. break;
  43. }
  44.  
  45. return QVariant();
  46. }
  47.  
  48. QVariant ModelTerminals::headerData(int section, Qt::Orientation orientation, int role) const
  49. {
  50. //Cоздаем заголовки столбцов модели
  51. if( role != Qt::DisplayRole ) {
  52. return QVariant();
  53. }
  54.  
  55. if( orientation == Qt::Vertical ) {
  56. return section;
  57. }
  58. switch( section ) {
  59. case 0:
  60. return tr( "" );
  61. case 1:
  62. return tr( "АЗС" );
  63. case 2:
  64. return tr( "Адрес" );
  65. case 3:
  66. return tr( "Сервер" );
  67. case 4:
  68. return tr( "Файл БД" );
  69. case 5:
  70. return tr( "Пароль" );
  71. }
  72.  
  73. return QVariant();
  74. }
  75.  
  76.  
  77. Qt::ItemFlags ModelTerminals::flags(const QModelIndex &index) const
  78. {
  79. Qt::ItemFlags flags = QAbstractTableModel::flags(index);
  80. if (index.column() == 0)
  81. {
  82. flags |= Qt::ItemIsUserCheckable;
  83. flags |= Qt::ItemIsSelectable;
  84. }
  85. else
  86. {
  87. flags |= Qt::ItemIsEditable;
  88. flags |= Qt::ItemIsSelectable;
  89. }
  90. return flags;
  91.  
  92. }
  93.  
  94. bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role)
  95. {
  96. Terminals t = term[index.row()];
  97. if(!index.isValid())
  98. return false;
  99. if(role == Qt::CheckStateRole)
  100. {
  101. if(value.toInt() == Qt::Checked)
  102. {
  103. t.setIsCheked(1);
  104. return true;
  105. }
  106. else
  107. {
  108. t.setIsCheked(0);
  109. return true;
  110. }
  111. }
  112. return false;
  113. }
  114.  

Код заполнения модели данными

  1. Terminals tr;
  2.  
  3. QSqlDatabase db = QSqlDatabase::database();
  4. QSqlQuery q = QSqlQuery(db);
  5.  
  6. QString strSQL = "SELECT DISTINCT t.terminal_id, TRIM(t.name), c.SERVER_NAME, c.DB_NAME, c.CON_PASSWORD FROM TERMINALS t "
  7. "LEFT JOIN CONNECTIONS c ON t.TERMINAL_ID = c.TERMINAL_ID "
  8. "LEFT JOIN SHIFTS s ON s.TERMINAL_ID = t.TERMINAL_ID "
  9. "WHERE t.TERMINALTYPE=3 and s.SHIFT_ID>0 "
  10. "ORDER BY t.TERMINAL_ID";
  11. if(!q.exec(strSQL)) {
  12. qInfo(logInfo()) << Q_FUNC_INFO << "Ошибка получения списка терминалов." << q.lastError().text();
  13. return;
  14. }
  15.  
  16. while (q.next()){
  17. tr.setIsCheked(0);
  18. tr.setTerminal(q.value(0).toInt());
  19. tr.setName(q.value(1).toString());
  20. tr.setServerName(q.value(2).toString());
  21. tr.setDatabase(q.value(3).toString());
  22. tr.setPassword(passConv(q.value(4).toString()));
  23. terminals.append(tr);
  24. }
  25. modelTerminals = new ModelTerminals(terminals);
  26. ui->tableViewTerminals->setModel(modelTerminals);
2

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

2
Evgenii Legotckoi
  • 10 апреля 2019 г. 13:43

Добрый день, Руслан

Гляньте, пожалуйста, вот этот топик - QSqlTableModel + QTableView + кастомный делегат в виде чекбокса

Вам нужно добавить делегат, поэтому думаю, что это то, что вам нужно.

    Ruslan Polupan
    • 10 апреля 2019 г. 14:12

    Спасибо, это я уже понял.
    Только нигде не найду законченого примера. :-)
    Куски кода которые не могу свести воедино.

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      • Последние комментарии
      • IscanderChe
        12 апреля 2025 г. 17:12
        Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
      • AK
        1 апреля 2025 г. 11:41
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        9 марта 2025 г. 21:02
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        9 марта 2025 г. 16:14
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        22 ноября 2024 г. 21:51
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…