Михаиллл
Михаиллл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 там не нужно, я на другую проблему думал поначалу

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    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
                    Последние комментарии
                    i
                    innorwall11 ноября 2024 г. 22:12
                    Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                    i
                    innorwall11 ноября 2024 г. 18:23
                    QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                    i
                    innorwall11 ноября 2024 г. 15:50
                    Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                    i
                    innorwall11 ноября 2024 г. 14:19
                    Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                    i
                    innorwall11 ноября 2024 г. 13:55
                    PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                    Сейчас обсуждают на форуме
                    i
                    innorwall11 ноября 2024 г. 20:56
                    добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                    i
                    innorwall11 ноября 2024 г. 10:55
                    Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                    9
                    9Anonim25 октября 2024 г. 9:10
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                    ИМ
                    Игорь Максимов3 октября 2024 г. 4:05
                    Реализация навигации по разделам Спасибо Евгений!

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