Михаиллл
Михаиллл7 мая 2020 г. 6:11

QAbstractTableModel каряво рисуется в QTableView

Добрый день.
Сделал модель, наследованную от QAbstractTableModel. Задаю эту модель для QTableView.
С этого момента начинается чертовщина. QTableView рисует кроме контента чек боксы и не хочет принимать заголовки столбцов, тогда как QSqlTableModel отображается корректно. Скажите пожалуйста, в чем может быть причина?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

9
Evgenii Legotckoi
  • 7 мая 2020 г. 6:18

Добрый день.
Код QAbstractTableModel смотреть нужно. Для заголовков нужно соответсвующим образом переопределять метод, который возвращает название стобцов, а для чекбоксов метод data и скорее всего метод flags, чтобы правильно возвращалась статус наличия чекбокса.

    Михаиллл
    • 7 мая 2020 г. 6:21

    Вот мой метод возвращения данных. В QMLон нормально работал.
    Скажите пожалуйста, что стоит поменять?
    Что нужно сделать с flags?

    QVariant MyModel::data(const QModelIndex & index, int role) const {
        //qDebug()<<role;
        qDebug()<<index.row()<<index.column();
         //return QVariant(QString("row = ") + QString::number(index.row()) + "  col = " + QString::number(index.column()));
        if (role < 0 || index.row() >= dateTime.count())
            return QVariant();
        if(index.column() == 0){
            return QVariant(dateTime[index.row()]);
        }
        if(index.column() == 1){
            return QVariant(value[index.row()]);
        }
        if(index.column() == 2){
            return QVariant(number[index.row()]);
        }
        return QVariant();
    }
    

    А название столбцов я так хотел помменять

    //    model->setHeaderData(0,Qt::Horizontal, "Время"); //change header
    //    model->setHeaderData(1,Qt::Horizontal, "Значение"); //change header
    //    model->setHeaderData(2,Qt::Horizontal, "Группа"); //change header
    
      Evgenii Legotckoi
      • 7 мая 2020 г. 6:35

      В QML вы писали делегат скорее всего, или как-то привязывали роли ко view элементам таблицы, поэтому там работало. Там просто иная специфика.

      Для заголовков я бы переопределил метод headerData

      QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
      {
          if (orientation == Qt::Horizontal)
          {
              switch (section)
              {
                  case 0:
                      return "Время";
                  case 1:
                      return "Значение";
                  case 2:
                      return "Группа";
                  default:
                      return QVariant();
          }
      
          return QAbstractTableModel::headerData(section, orientation, role);
      }
      

      Что касается метода flags, то наверное так, если бы я хотел выключить чекбоксы.

      Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
      {
          Qt::ItemFlags flags = QAbstractTableModel::flags(index);
          flags.setFlag(Qt::ItemIsUserCheckable, false);
          return flags;
      }
      
        Михаиллл
        • 7 мая 2020 г. 7:17
        • (ред.)

        Эта функция не поменяла флажки

            Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
            {
                Qt::ItemFlags flags = QAbstractTableModel::flags(index);
                flags.setFlag(Qt::ItemIsUserCheckable, false);
                return flags;
            }
        

        А эта просто убирает почему-то заголовки

        QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
        {
            if (orientation == Qt::Horizontal)
            {
                switch (section)
                {
                case 0:
                    return "Время";
                case 1:
                    return "Значение";
                case 2:
                    return "Группа";
                default:
                    return QVariant();
                }
            }
            return QAbstractTableModel::headerData(section, orientation, role);
        
        }
        

        Скажите пожалуйста, что не так?

          Evgenii Legotckoi
          • 7 мая 2020 г. 7:21

          Покажите содержимое заголовочного файла MyModel

          А headerData попробуйте так поправить, скорее всего нужно ещё роль учесть

          QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
          {
              if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
              {
                  switch (section)
                  {
                  case 0:
                      return "Время";
                  case 1:
                      return "Значение";
                  case 2:
                      return "Группа";
                  default:
                      return QVariant();
                  }
              }
              return QAbstractTableModel::headerData(section, orientation, role);
          
          }
          
            Михаиллл
            • 7 мая 2020 г. 7:35
            • (ред.)

            Заголовки появились, спасибо.
            Вот заголовочный файл:

            #ifndef MYMODEL_H
            #define MYMODEL_H
            
            #include <QObject>
            #include <QAbstractTableModel>
            #include "QDebug"
            #include <QSqlDatabase>
            #include "QSqlQuery"
            #include "QSqlError"
            #include "QDateTime"
            
            class MyModel : public QAbstractTableModel
            {
                Q_OBJECT
            
            public:
                enum Roles {
                    Role1 = 0,
                    Role2,
                    Role3
                };
            
                MyModel(QString pathTable, QObject *parent = nullptr);
            
                Qt::ItemFlags flags(const QModelIndex &index) const;
            
            
                QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
            
                void addRow(QString str1, long long str2, int str3);
            
                int columnCount(const QModelIndex &parent) const;
            
                int rowCount(const QModelIndex & parent = QModelIndex()) const;
            
                QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
            
                QHash<int, QByteArray> roleNames() const;
            
                int getMyColumn() const;
                void setMyColumn(int number);
            
            private:
                QVector <QString> dateTime;
                QVector <long long> dateSecs;
                QVector <double> value;
                QVector <int> number;
            
            
            };
            
            #endif // MYMODEL_H
            
            
              Evgenii Legotckoi
              • 7 мая 2020 г. 7:41
              • Ответ был помечен как решение.

              Кажись знаю, метод data, тоже проверку на роль нужно делать

              QVariant MyModel::data(const QModelIndex & index, int role) const 
              {
                  if (role == Qt::DisplayRole)
                  {
                      if (role < 0 || index.row() >= dateTime.count())
                          return QVariant();
                      if (index.column() == 0) {
                          return QVariant(dateTime[index.row()]);
                      }
                      if (index.column() == 1) {
                          return QVariant(value[index.row()]);
                      }
                      if (index.column() == 2) {
                          return QVariant(number[index.row()]);
                      }
                  }
                  return QVariant();
              }
              
                Михаиллл
                • 7 мая 2020 г. 7:50

                Спасибо, так заработало, и работает без переопределения метода flags

                  Evgenii Legotckoi
                  • 7 мая 2020 г. 7:51

                  ну да, flags там не нужно, я на другую проблему думал поначалу

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    e
                    • ehot
                    • 1 апреля 2024 г. 0:29

                    C++ - Тест 003. Условия и циклы

                    • Результат:78баллов,
                    • Очки рейтинга2
                    B

                    C++ - Тест 002. Константы

                    • Результат:16баллов,
                    • Очки рейтинга-10
                    B

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

                    • Результат:46баллов,
                    • Очки рейтинга-6
                    Последние комментарии
                    k
                    kmssr9 февраля 2024 г. 5:43
                    Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    АК
                    Анатолий Кононенко5 февраля 2024 г. 12:50
                    Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    EVA
                    EVA25 декабря 2023 г. 21:30
                    Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                    J
                    JonnyJo25 декабря 2023 г. 19:38
                    Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                    G
                    Gvozdik19 декабря 2023 г. 8:01
                    Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                    Сейчас обсуждают на форуме
                    a
                    a_vlasov14 апреля 2024 г. 16:41
                    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                    Павел Дорофеев
                    Павел Дорофеев14 апреля 2024 г. 12:35
                    QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                    f
                    fastrex4 апреля 2024 г. 14:47
                    Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                    P
                    Pisych27 февраля 2023 г. 15:04
                    Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                    AC
                    Alexandru Codreanu19 января 2024 г. 22:57
                    QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                    Следите за нами в социальных сетях