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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема менять checkbox в модели.  (Прочитано 5359 раз)
Jkc
Гость
« : Март 27, 2012, 14:46 »

Задача как мне показалось на первый взгляд простая, а иенно получаем данные и заполняем таблицу,
но последняя колонка должна быть чекбоксами, за основу взял пример
http://www.prog.org.ru/topic_17115_0.html
и немного модифицирован

Код:
TxTableModel::TxTableModel(QObject *parent) :
    QAbstractTableModel(parent)
........
QVariant TxTableModel::data(const QModelIndex & index, int role) const
{
    switch(role){
    case Qt::DisplayRole:  // заполнение данными
        return  m_DataPtr->getCell(index.row(), index.column());
    break;
        case Qt::CheckStateRole :
           if(m_DataPtr->isColumnCheck( index.column()) ){
               ВОТ ТУТ
                мне нужно изменить данные моём классе с данными, и вернуть нужный Qt::CheckState
            }
        }
}
Пересмотрел уже массу примеров , но все нечего не выходит, может у кого то есть простенький пример?
Записан
mutineer
Гость
« Ответ #1 : Март 27, 2012, 14:53 »

ты уверен что менять хочешь именно в data? data вызывается при отображении элемента
Записан
Jkc
Гость
« Ответ #2 : Март 27, 2012, 14:58 »

ты уверен что менять хочешь именно в data? data вызывается при отображении элемента
А где можно менять?
И как вообще получить свои изменения в чекбоксе?
« Последнее редактирование: Март 27, 2012, 15:10 от Jkc » Записан
Jkc
Гость
« Ответ #3 : Март 28, 2012, 10:40 »

В общем проблему решил следующим образом
Код:
/**
  * Filling in the data table
  */
QVariant TxTableModel::data(const QModelIndex & index, int role) const
{
    //  qDebug("TxTableModel::data");
    switch(role){
    case Qt::DisplayRole:  // заполнение данными
        return m_DataPtr->getCell(index.row(), index.column());
        break;

    case Qt::CheckStateRole:

        if(m_DataPtr->isColumnCheck( index.column()) &&
           m_DataPtr->isRowCheck( index.column())   )
        {
            return m_DataPtr->getItemChecedId(index.row());
        }
        break;
    }

    return QVariant();
}

/**
  * Change data in datagred
  */
bool TxTableModel::setData( const QModelIndex & index, const QVariant & value, int role  )
{
    //    Qt::EditRole  //  для изменения в ячейке
    if (role == Qt::CheckStateRole)
    {
        m_DataPtr->isItemChecedId(index.row());
    }
    return true;
}

/**
  * Sets the flag
  */
Qt::ItemFlags TxTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;

    return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable
            | Qt::ItemIsEditable ;
}

остался один неудобный момент, в моём случае чекбоксы следуют по всей одной колонке , по этому для
мапинга достаточно номара строки, но как быть если чекбоксы должны быть в разных местах. Кроме как
мапинг с row и column решения я не нашел, пробовал index.internalId()  но он всегда возвращает 0.
Записан
mutineer
Гость
« Ответ #4 : Март 28, 2012, 10:55 »

Чтобы index.internalId() что-то возвращал, нужно в этот самый internalId что-то записать. Делается это в методе index()
Записан
Jkc
Гость
« Ответ #5 : Март 28, 2012, 11:16 »

Чтобы index.internalId() что-то возвращал, нужно в этот самый internalId что-то записать. Делается это в методе index()
у вас примера случайно нет?
Записан
mutineer
Гость
« Ответ #6 : Март 28, 2012, 11:23 »

http://doc.crossplatform.ru/qt/4.7.x/html-qt/itemviews-simpletreemodel-treemodel-cpp.html

Код
C++ (Qt)
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
{
    ...
    TreeItem *childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem);
    else
        return QModelIndex();
    ...
}
 
Записан
Jkc
Гость
« Ответ #7 : Март 28, 2012, 17:17 »

Спасибо за помощь, Переделал вот так

Код:
QModelIndex TxTableModel::index(int row, int column, const QModelIndex &parent) const
{
    if(parent == QModelIndex())
    {
        return createIndex(row, column, (quint32)(row+1) * 10 + (column));
    }

    return QModelIndex();
}
Записан
mutineer
Гость
« Ответ #8 : Март 28, 2012, 17:20 »

почему (row+1) * 10 + (column) нужно обязательно сохранять в индекс, а не вычислять на месте?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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