2015-05-29 3 views
1

Я хотел бы отобразить QVector3D в таблицеView, желательно, как это: (x, y, z). я подклассы класса QAbstractTableModel и реализованы функции QAbstractTableModelSublass :: данные:Как отобразить QVector3D в одной ячейке в QTableView с помощью подкласса qAbstractTableModel

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. Нет преобразования из QVector3D в QString в QVariant (см. documentation).

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

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

+0

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

2

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

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()); 
    } 
} 
+0

Ах, в этом случае, если модель редактируется, я полагаю, что должно обеспечить валидатор? – dodol

+2

Да, вы должны проверить входную строку в форме «(x, y, z)» или другой, проанализировать ее и построить новый QVector3D. – vahancho