Как отобразить QVector3D в одной ячейке в QTableView через подкласс qAbstractTableModel

Я хотел бы отобразить QVector3D в tableView, желательно так: (x,y,z). Я создал подкласс класса QAbstractTableModel и реализовал функцию QAbstractTableModelSublass::data:

QVariant data(const QModelIndex &index, int role= Qt::DisplayRole) const override
{
  ...
  if(role == Qt::DisplayRole)
  {  /* decide in which column and row to display the data*/
    QVector3D p(1.,2.,3.); return QVariant(p); 
  }
}

Однако целевая ячейка, в которой должен отображаться QVector3D, пуста. Я совершенно уверен, что создан правильный экземпляр QVariant, так как я смог напечатать значение следующим образом:

QVariant v = QVariant(p);
qDebug()<<v.value<QVector3D>();

Что мне не хватает? Как я должен отображать QVector3D в таблице в одной ячейке?

2 ответа

Решение

Qt::DisplayRole требует QString в варианте, но вы предоставляете QVector3D. В QVariant нет преобразования из QVector3D в QString (см. Документацию).

Вы должны либо преобразовать Вектор в строковое представление самостоятельно, либо использовать QStyledItemDelegate переопределить displayText метод для преобразования QVector3D в строковые представления.

NB: Ваш вывод отладки работает, потому что есть выделенный QDebug operator<<(QDebug dbg, const QVector3D &vector) для печати QVector3D в QDebug

Я бы сделал это следующим образом:

QVariant data(const QModelIndex &index, int role= Qt::DisplayRole) const
{
  ...
  if(role == Qt::DisplayRole)
  {  /* decide in which column and row to display the data*/
    QVector3D p(1.,2.,3.);
    return QString("(%1, %2, %3)").arg(p.x()).arg(p.y()).arg(p.z()); 
  }
}
Другие вопросы по тегам