C++ 如何通过qAbstractTableModel'在QTableView的一个单元格中显示QVector3D;s子类
我想在tableView中显示QVector3D,最好是这样:(x,y,z)。 我已经对QAbstractTableModel类进行了子类化,并实现了QAbstractTableModelSubClass::data函数:C++ 如何通过qAbstractTableModel'在QTableView的一个单元格中显示QVector3D;s子类,c++,qt,qt5,qtableview,qvector3d,C++,Qt,Qt5,Qtableview,Qvector3d,我想在tableView中显示QVector3D,最好是这样:(x,y,z)。 我已经对QAbstractTableModel类进行了子类化,并实现了QAbstractTableModelSubClass::data函数: QVariant data(const QModelIndex &index, int role= Qt::DisplayRole) const override { ... if(role == Qt::DisplayRole) { /* decide
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>();
QVariant v=QVariant(p);
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());
}
}
我会用以下方法来做:
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());
}
}
Qt::DisplayRole
需要变量中的QString,但您提供的是QVector3D。QVariant中没有从QVector3D到QString的转换(请参阅)
您应该自己将矢量转换为字符串表示,或者使用替代将QVector3D转换为字符串表示的displayText
方法
注意:您的调试输出工作正常,因为有一个专用的QDebug操作符,Qt::DisplayRole
需要变量中的QString,但您提供的是QVector3D。QVariant中没有从QVector3D到QString的转换(请参阅)
您应该自己将矢量转换为字符串表示,或者使用替代将QVector3D转换为字符串表示的displayText
方法
注意:你的调试输出是有效的,因为有一个专用的QDebug操作符,在这种情况下,如果模型是可编辑的,我想应该提供一个验证器?是的,你应该以“(x,y,z)”或其他形式验证输入字符串,解析它并构造新的QVector3D。啊,在这种情况下,如果模型是可编辑的,我认为这应该提供一个验证器?是的,您应该以“(x,y,z)”或其他形式验证输入字符串,解析它并构造新的QVector3D。当QVector3D为(0,0,0)时,甚至不调用QStyledItemDelegate::displayText(在fn正文中称为qDebug)。也就是说,没有显示任何内容。当至少有一个组件不为零时,一切正常。如果我不使用delegate并在data()fn中返回QString,如下面vahancho的回答中所述,该值将按预期显示。这是什么魔法?当QVector3D为(0,0,0)时,甚至不调用QStyledItemDelegate::displayText(在fn正文中称为qDebug)。也就是说,没有显示任何内容。当至少有一个组件不为零时,一切正常。如果我不使用delegate并在data()fn中返回QString,如下面vahancho的回答中所述,该值将按预期显示。这是什么魔法?