Как отобразить 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());
}
}