Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Jkc от Март 27, 2012, 14:46



Название: Проблема менять checkbox в модели.
Отправлено: 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
            }
        }
}
Пересмотрел уже массу примеров , но все нечего не выходит, может у кого то есть простенький пример?


Название: Re: Проблема менять checkbox в модели.
Отправлено: mutineer от Март 27, 2012, 14:53
ты уверен что менять хочешь именно в data? data вызывается при отображении элемента


Название: Re: Проблема менять checkbox в модели.
Отправлено: Jkc от Март 27, 2012, 14:58
ты уверен что менять хочешь именно в data? data вызывается при отображении элемента
А где можно менять?
И как вообще получить свои изменения в чекбоксе?


Название: Re: Проблема менять checkbox в модели.
Отправлено: Jkc от Март 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.


Название: Re: Проблема менять checkbox в модели.
Отправлено: mutineer от Март 28, 2012, 10:55
Чтобы index.internalId() что-то возвращал, нужно в этот самый internalId что-то записать. Делается это в методе index()


Название: Re: Проблема менять checkbox в модели.
Отправлено: Jkc от Март 28, 2012, 11:16
Чтобы index.internalId() что-то возвращал, нужно в этот самый internalId что-то записать. Делается это в методе index()
у вас примера случайно нет?


Название: Re: Проблема менять checkbox в модели.
Отправлено: mutineer от Март 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();
    ...
}
 


Название: Re: Проблема менять checkbox в модели.
Отправлено: Jkc от Март 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();
}


Название: Re: Проблема менять checkbox в модели.
Отправлено: mutineer от Март 28, 2012, 17:20
почему (row+1) * 10 + (column) нужно обязательно сохранять в индекс, а не вычислять на месте?