Михаиллл
МихаилллMay 7, 2020, 6:11 a.m.

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

9
Evgenii Legotckoi
  • May 7, 2020, 6:18 a.m.

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

    Михаиллл
    • May 7, 2020, 6:21 a.m.

    Вот мой метод возвращения данных. В 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
      • May 7, 2020, 6:35 a.m.

      В 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;
      }
      
        Михаиллл
        • May 7, 2020, 7:17 a.m.
        • (edited)

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

            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
          • May 7, 2020, 7:21 a.m.

          Покажите содержимое заголовочного файла 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);
          
          }
          
            Михаиллл
            • May 7, 2020, 7:35 a.m.
            • (edited)

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

            #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
              • May 7, 2020, 7:41 a.m.
              • The answer was marked as a solution.

              Кажись знаю, метод 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();
              }
              
                Михаиллл
                • May 7, 2020, 7:50 a.m.

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

                  Evgenii Legotckoi
                  • May 7, 2020, 7:51 a.m.

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

                    Comments

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    AD

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:50points,
                    • Rating points-4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:80points,
                    • Rating points4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:20points,
                    • Rating points-10
                    Last comments
                    i
                    innorwallNov. 14, 2024, 11:07 p.m.
                    Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
                    i
                    innorwallNov. 14, 2024, 10:42 p.m.
                    How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                    i
                    innorwallNov. 14, 2024, 8:09 p.m.
                    Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                    i
                    innorwallNov. 14, 2024, 3:05 p.m.
                    EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
                    i
                    innorwallNov. 14, 2024, 3 p.m.
                    PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
                    Now discuss on the forum
                    i
                    innorwallNov. 14, 2024, 2:39 p.m.
                    добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                    i
                    innorwallNov. 11, 2024, 9:55 p.m.
                    Всё ещё разбираюсь с кешем. 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
                    9AnonimOct. 25, 2024, 7:10 p.m.
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Follow us in social networks