Михаиллл
Михаиллл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
                    ИМ
                    Игорь МаксимовNov. 22, 2024, 7:51 p.m.
                    Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii LegotckoiOct. 31, 2024, 9:37 p.m.
                    Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZEOct. 19, 2024, 3:19 p.m.
                    Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь МаксимовOct. 5, 2024, 2:51 p.m.
                    Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas5July 5, 2024, 6:02 p.m.
                    QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Now discuss on the forum
                    m
                    moogoNov. 22, 2024, 3:17 p.m.
                    Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                    Evgenii Legotckoi
                    Evgenii LegotckoiJune 24, 2024, 10:11 p.m.
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey1Nov. 15, 2024, 2:04 p.m.
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProjectJune 4, 2022, 10:49 a.m.
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                    Follow us in social networks