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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSortFilterProxyModel вызывает data() со второго раза.  (Прочитано 3239 раз)
djfile
Гость
« : Март 05, 2012, 14:28 »

Здравствуйте. Кратко об основном: пользователь вводит данные в основную таблицу, затем вводит ограничения по этим данным, основная модель все это переваривает и выдает номера строк которые наилучшим образом удовлетворяют условиям (такой частный случай многокритериальной оптимизации). Номера этих строк я передаю в наследника QSortFilterProxyModel, который по ним выдергивает из основной модели нужные строки.
Проблема: После первого нажатия на кнопку "Посчитать" для QSortFilterProxyModel выводится пустая таблица, в которой есть необходимое количество столбцов, но нет строк , после повторного нажатия и далее все замечательно работает. Как я понял понял при первом вызове не вызывается метод data().
Вот код:
Код:
#include "resultmodel.h"
#include <QDebug>

ResultModel::ResultModel(QObject *parent) :
    QSortFilterProxyModel(parent)
{
}

int ResultModel::rowCount(const QModelIndex &parent) const
{
    qDebug() << "ResultModel::rowCount ";
    if (!m_resultRow.isEmpty()) {
        qDebug() << m_resultRow.size();
        return m_resultRow.size();
    }
    qDebug() << 0;
    return 0;
}

int ResultModel::columnCount(const QModelIndex &parent) const
{
    qDebug() << "ResultModel::columnCount ";
    if (sourceModel()) {
        qDebug() << sourceModel()->columnCount(parent);
        return sourceModel()->columnCount(parent);
    }
    qDebug() << "0";
    return 0;
}

QVariant ResultModel::data(const QModelIndex &index, int role) const
{
    qDebug() << "ResultModel::data";
    if (!index.isValid())
        return QVariant();

    switch (role) {
    case Qt::DisplayRole:
        QModelIndex modelIndex = createIndex(m_resultRow.at(index.row()), index.column());
        return sourceModel()->data(modelIndex, role);
        break;
    }
    return QVariant();
}

Qt::ItemFlags ResultModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
                 return Qt::ItemIsEnabled;

        return QAbstractItemModel::flags(index);
}

void ResultModel::setResultRow(const QVector<int> &resultRow)
{
    qDebug() << "ResultModel::setResultRow";
    m_resultRow = resultRow;
}
Записан
mutineer
Гость
« Ответ #1 : Март 05, 2012, 14:31 »

А как выглядит вывод в дебаг?
Записан
Bepec
Гость
« Ответ #2 : Март 05, 2012, 14:34 »

Он может вызываться аж по нескольким причинам.

Начнём - к примеру не передаётся, или неправильно передаётся число строк, если их 0, то он их и не запрашивает однако.

m_resultRow - что это и откуда?

Так же довольно интересная функция rowCount. Зачем тебе проверка на Empty, если size() всёравно вернёт 0???


Записан
djfile
Гость
« Ответ #3 : Март 05, 2012, 14:54 »

Задал вопрос, пошёл покурил, подумал... И вроде нашел в чем проблема=)
Поменял в методе расчета 2 строчки местами и все стало ок. Как было:
Код:
m_resultWindow->setSourceModel(m_pTableModel);
m_resultWindow->setResultRow(resultRow);

Цитировать
m_resultRow - что это и откуда?
Тут хранятся индексы строк, которые выкинула основная модель в качестве подходящих.
Цитировать
Так же довольно интересная функция rowCount. Зачем тебе проверка на Empty, если size() всёравно вернёт 0???
Это я уже отчаяния.=)

Но нашёл ещё один баг. Во время редактирования ячейки основной таблицы нажать на "Посчитать", то если пользователь не нажал на Enter, то в выходную таблицу может попасть строка с неправильными данными. Как при нажатии на "Посчитать" сначала закрыть редактор ячейки, отослать изменения и уже потом начать считать?
« Последнее редактирование: Март 05, 2012, 14:59 от djfile » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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