Как отобразить 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 в таблице в одной ячейке?


person dodol    schedule 29.05.2015    source источник


Ответы (2)


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

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

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

person king_nak    schedule 29.05.2015
comment
QStyledItemDelegate :: displayText даже не вызывается (называется qDebug в теле fn), когда QVector3D имеет значение (0,0,0). То есть ничего не отображается. Все нормально, когда хотя бы один компонент не равен нулю. Если я не использую делегат и не возвращаю QString в data () fn, как описано ниже в ответе vahancho, значение отображается, как ожидалось. Что это за колдовство? - person dodol; 29.05.2015

Я бы сделал это так:

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()); 
  }
}
person vahancho    schedule 29.05.2015
comment
Ах, в том случае, если модель доступна для редактирования, я полагаю, это должен предоставить валидатор? - person dodol; 29.05.2015
comment
Да, вы должны проверить входную строку в форме (x, y, z) или другой, проанализировать ее и построить новый QVector3D. - person vahancho; 29.05.2015