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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
s
June 3, 2020, 2:56 a.m.
silo1995

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

  • Result:35points,
  • Rating points-10
AP
June 2, 2020, 10:11 p.m.
Aleksej Pikenin

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
June 2, 2020, 2:04 p.m.
Daniil Chizhevskij

C++ - Test 001. The first program and data types

  • Result:86points,
  • Rating points6
Last comments
June 5, 2020, 2:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

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

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 2:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

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

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

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

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Полностью скопировал пример - всё правильно работает. Значит, где-то у меня ошибки в тестовом проекте. Буду разбираться. Извините за беспокойство. :)
Now discuss on the forum
MA
June 4, 2020, 3:46 a.m.
Mihail A

Qt- C++ QTableView подсветить строку

Спасибо.
f
June 3, 2020, 2:49 a.m.
fryn3

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

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
June 2, 2020, 3:46 a.m.
Evgenij Legotskoj

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

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

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

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

SSL на Android

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