C++ 如何通过qAbstractTableModel'在QTableView的一个单元格中显示QVector3D;s子类

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

我想在tableView中显示QVector3D,最好是这样:(x,y,z)。 我已经对QAbstractTableModel类进行了子类化,并实现了QAbstractTableModelSubClass::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>();
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的回答中所述,该值将按预期显示。这是什么魔法?