7 мая 2020 г. 6:11

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

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

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

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

Вот мой метод возвращения данных. В 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

В 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;
}

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

    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);

}

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

Покажите содержимое заголовочного файла 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);

}

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

#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

Кажись знаю, метод 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();
}

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
s
3 июня 2020 г. 2:56
silo1995

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

  • Результат:35баллов,
  • Очки рейтинга-10
АП
2 июня 2020 г. 22:11
Алексей Пикенин

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
2 июня 2020 г. 14:04
Даниил Чижевский

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

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
5 июня 2020 г. 2:39
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
5 июня 2020 г. 2:34
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
5 июня 2020 г. 2:31
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
5 июня 2020 г. 2:27
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Разобрался. У вас изначально в проекте были вот эти настройки: ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->setSelectionMode(QAbstractItemVie…
4 июня 2020 г. 12:10
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Полностью скопировал пример - всё правильно работает. Значит, где-то у меня ошибки в тестовом проекте. Буду разбираться. Извините за беспокойство. :)
Сейчас обсуждают на форуме
МА
f
3 июня 2020 г. 2:49
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
2 июня 2020 г. 3:46
Евгений Легоцкой

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
2 июня 2020 г. 3:01
Евгений Легоцкой

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
a
1 июня 2020 г. 11:26
alekseyttrv

SSL на Android

у меня стоит версия Qt 5.14.2. В настройках android поставил openssl из коробки, и этот прроект автоматически стянулся. Достаточно было только добавить в .pro-файл строку после этого и все …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB