Для чего используется QTreeWidgetItem::setData

282
14 августа 2017, 11:07

Для чего нам нужен QTreeWidgetItem::setData(int column, int role, const QVariant & value), если в результате отображение данных всё равно текстовом формате? Пример использования:

 void AbonentWidget::updateTreeItem( QTreeWidgetItem* pTreeWidgetItem, const AMR::CMeterParams& oMeterParams )
    {
        AMR_ASSERT( oMeterParams.isValidSerialNum() );
        if( pTreeWidgetItem )
        {
            AMR::DatabaseStruct::CCommissioning oCommissioning = AMR::Settings().getDatabase().load_commissioning( oMeterParams.getCommissioningUuid() );
            pTreeWidgetItem->setData( 0, Qt::UserRole, oMeterParams.getModelStr() );// зачем используется здесь?
            pTreeWidgetItem->setText( 0, oMeterParams.getFamilyString()   );// если в результате используем здесь?
            pTreeWidgetItem->setText( 1, oMeterParams.getModelStrCustom() );
            pTreeWidgetItem->setText( 2, oMeterParams.getSerialStr()      );
            pTreeWidgetItem->setText( 3, oMeterParams.getFirmware()       );
            pTreeWidgetItem->setText( 4, oCommissioning.getPeriod()       );
        }
        else AMR_ASSERT_FALSE();
    }
Answer 1

С ролью Qt::UserRole первый вызов

setData(int column, int role, const QVariant& value)

добавит в столбец column QTreeWidgetItem'а роль Qt::UserRole со значением value. Каждый последующий вызов setData с тем же столбцом(column) и ролью(Qt::UserRole) будет изменять значение(value), которое соответствует этой роли.

Роль это просто признак для модели, какой из методов для чтения или записи внутренних членов будет вызван у итема. Внутри итема может быть много данных, которые инизиализируются при его создании, например картинка заднего фона. Мы можем как получить ссылку на картинку вызвав у модели data(...) c необходимой ролью Qt::DecorationRole

QVariant data(const QModelIndex& index, Qt::DecorationRole)

так и перезаписать эту картинку вызвав уже setData()

bool setData(const QModelIndex &index, const QVariant &value, Qt::DecorationRole)

Для примера метод data(...)

QVaraint MyModel::data(const QModelIndex& index, Qt::DecorationRole) const
{
  if(index.isValid() == false)
    return QVariant();
  QVariant result;
  MyItem* item = static_cast<MyItem*>(index.internalPointer());
  switch (role):
  {
    case Qt::DecorationRole:
     result = item->getBackground();
     break;
    case Qt::UserRole + 1:
      result = item->getUserRolePlusOneValue();
      break;
  }
  return result;
}

Каждый QTreeWidgetItem внутри содержит вектор:

QVector< QVector<QWidgetItemData> > values;

где, QVector<QWidgetItemData> это вектор пар (роль, значение), то есть для каждого столбца у вас есть множество ролей, в соответствии с которыми вы получаете значения. Еще раз, вызвав для итема

pQTreeWidgetItem->setData(0, Qt::UserRole, const QVariant& value);

вы добавляете нулевому столбцу итема роль Qt::UserRole со значением value; вы можете прочитать это значение вызвав

value val = pQTreeWidgetItem->data(0, Qt::UserRole).toValue();
READ ALSO
Тип всего выражения

Тип всего выражения

Недавно написал такую функцию:

182
config.h: No such file or directory

config.h: No such file or directory

Привет! Пытаюсь скомпилять это чтоб создать нагрузку на свой rsyslog для тестирования сжатияНо эта зараза ни в какую не хочет компиляться, ругается...

247
Текущая директория плюс строка в PTCHAR [требует правки]

Текущая директория плюс строка в PTCHAR [требует правки]

Есть функция, принимающая параметр PTCHAR path, этим параметром мне нужно передать текущую директорию (откуда запущен exe), склеенную со статичной...

289
Запись и чтение данных в SQLite3 на с++

Запись и чтение данных в SQLite3 на с++

Добрый день! Как правильно записать данные в sqlite, и соответственно считать их на с++? Данные представляют собой несколько переменных разных...

202