Russian Qt Forum
Ноябрь 22, 2024, 16:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка в QTableView с QAbstractTableModel и данными, хранящимися в QMAp  (Прочитано 8182 раз)
ЙадоФитый ПлюсЧ
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« : Август 03, 2016, 13:20 »

Добрый день!

Создал свою модель на основе QAbstractTableModel. Данные для модели хранятся в QMap с ключом int и значением в своем типе на основе структуры. (Хотя изначально нужно было, чтобы QMap был с ключом типа QString).

Код:
#ifndef MYDATALISTMODEL_H
#define MYDATALISTMODEL_H

#include <QObject>
#include <QAbstractTableModel>
#include <QVariant>
#include <QModelIndex>

#include "structures.h"

class MyDataListModel : public QAbstractTableModel
{
public:
    MyDataListModel(QWidget *parent = 0);
    ~MyDataListModel();

    int rowCount(const QModelIndex &parent = QModelIndex()) const;

    void updateModel(QString, tMyData, int indexRow = 0);
    void clearData();

private:
    QMap<int, tMyDataModel> MyDataList;

    int columnCount(const QModelIndex &parent) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    QVariant data(const QModelIndex &index, int role) const;
};

#endif // MYDATALISTMODEL_H

Код:
#include "MyDatalistmodel.h"

MyDataListModel::MyDataListModel(QWidget *parent)
{

}

MyDataListModel::~MyDataListModel()
{

}

int MyDataListModel::rowCount(const QModelIndex &parent) const
{
    return(MyDataList.keys().count());
}

void MyDataListModel::updateModel(QString MyDataName, tMyData MyDataInfo, int indexRow)
{
    this->beginResetModel();
    MyDataList[indexRow].MyDataName=MyDataName;
    MyDataList[indexRow].MyDataInfo=MyDataInfo;
    insertRow(indexRow);
    this->endResetModel();
}

void MyDataListModel::clearData()
{
    this->beginResetModel();
    int rowC;
    rowC=rowCount();
    MyDataList.clear();
    removeRows(0,rowC);
    this->endResetModel();
}

int MyDataListModel::columnCount(const QModelIndex &parent) const
{
    return(9);
}

QVariant MyDataListModel::headerData(int section, Qt::Orientation orientation, int role)  const
{
    if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
    {
        switch (section)
        {
            case 1:
                {return(QVariant(tr("Icon")));}
            break;
            case 2:
                {return(QVariant(tr("Data1")));}
            break;
            case 3:
                {return(QVariant(tr("Data2")));}
            break;
            case 4:
                {return(QVariant(tr("Data3")));}
            break;
            case 5:
                {return(QVariant(tr("Data4")));}
            break;
            case 6:
                {return(QVariant(tr("Data5")));}
            break;
            case 7:
                {return(QVariant(tr("Data6")));}
            break;
            case 8:
                {return(QVariant(tr("Data7")));}
            break;
            default:
                {return(QVariant());}
            break;
        }
    }
    else
        {return(QVariant());}
}

QVariant MyDataListModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
    {
        QVariant Unswer;
        switch (index.column())
        {
            case 0:
                {Unswer=index.row();}
            break;
            case 2:
                {Unswer=QVariant(MyDataList[index.row()].MyDataName);}
            break;
            case 3:
                 {Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data2);}
            break;
            case 4:
            {
                if (MyDataList[index.row()].MyDataInfo.Data3)
                    {Unswer=QVariant("3 A");}
                else
                    {Unswer=QVariant("3 B");}
            }
            break;
            case 5:
                {Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data4);}
            break;
            case 6:
            {
                if (MyDataList[index.row()].MyDataInfo.Data5)
                    {Unswer=QVariant("5 A");}
                else
                     {Unswer=QVariant("5 B");}
            }
            break;
            case 7:
                {Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data6);}
            break;
            case 8:
                {Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data7);}
            break;
            default:
            break;
        }
        return(Unswer);
    }
    else
    {return(QVariant());}
}

Модель назначена для объекта класса QTableView.
Код:
    MyDataModel = new MyDatatModel(this);
    ui->tableView->setModel(APKListModel);
    ui->tableView->setColumnHidden(0, true);
Проблем с отображением данных нет.

Однако, не работает сортировка.
До этого я с моделями не работал. Поэтому не знаю как правильно организовать.
Я не уверен, что QSortFilterProxyModel будет работать из-за такого выбора хранения данных для модели. Или это вообще роли не играет?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Август 03, 2016, 13:36 »

В доке QSortFilterProxyModel написано, что по-умолчанию модель сортирует по Qt::DisplayRole. Можно ей задать и другую роль сортировки используя QSortFilterProxyModel::setSortRole. А если уж совсем хочется свои условия сортировки, тогда нужно создать потомка QSortFilterProxyModel и переопределить метод QSortFilterProxyModel::lessThan
Записан

ЙадоФитый ПлюсЧ
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #2 : Август 03, 2016, 17:31 »

В доке QSortFilterProxyModel написано, что по-умолчанию модель сортирует по Qt::DisplayRole. Можно ей задать и другую роль сортировки используя QSortFilterProxyModel::setSortRole. А если уж совсем хочется свои условия сортировки, тогда нужно создать потомка QSortFilterProxyModel и переопределить метод QSortFilterProxyModel::lessThan

QSortFilterProxyModel отработала как надо. Спасибо.

Теперь другой вопрос появился. Чтобы сделать чередование строк разными цветами, я должен создать свою модель, унаследованную от QSortFilterProxyModel, и переопределить в ней функции data в части Qt:BackgroundColorRole ?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Август 04, 2016, 09:46 »

Во вьюхе есть свойство разноцветных строк.
Записан
ЙадоФитый ПлюсЧ
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #4 : Август 04, 2016, 11:08 »

Во вьюхе есть свойство разноцветных строк.
С приведенной ранее моделью, это свойство не отработало.
А вот с неизмененной QSortFilterProxyModel все заработало как нужно.

__Heaven__, gil9red! Спасибо за помощь!
Теперь буду разбираться как вытащить из модели данные для выделенных строк. Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Август 04, 2016, 13:01 »

QItemSelectionModel *QAbstractItemView::selectionModel() const
QModelIndexList QItemSelectionModel::selectedIndexes() const
QModelIndex QAbstractProxyModel::mapToSource(const QModelIndex &proxyIndex) const
Записан
ЙадоФитый ПлюсЧ
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #6 : Август 24, 2016, 08:28 »

QItemSelectionModel *QAbstractItemView::selectionModel() const
QModelIndexList QItemSelectionModel::selectedIndexes() const
QModelIndex QAbstractProxyModel::mapToSource(const QModelIndex &proxyIndex) const

Большое спасибо! Разобрался. Все сделал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 22.