ユーザーがQGraphicsViewでいくつかのカスタムQGraphicsItemを描画できるこのアプリケーションがあり、それらのアイテムに関するいくつかのデータもQTableWidgetに表示されるようにしたいと思います。
カスタムQGraphicsItemのコード:ヘッダーファイル:
クラスクロソイド:public QGraphicsItem {{ 公衆: Clothoid(QPoint startPoint、QPoint endPoint); 仮想〜クロソイド(); QPoint sPoint; QPoint ePoint; CFloat startCurvature; CFloat endCurvature; CFloatclothoidLength; CFloattangentAngle; ..。 }
cppファイル:
Clothoid :: Clothoid(QPoint startPoint、QPoint endPoint) {{ sPoint = startPoint; ePoint = endPoint; startCurvature = 0.0; endCurvature = 0.0; clothoidLength = sqrt(pow(endPoint.x()-startPoint.x()、2)+ pow(endPoint.y()-startPoint.y()、2)); }
グラフィックビューのコード:
renderArea :: renderArea(QWidget * parent): QGraphicsView(親) {{ シーン=新しいQGraphicsScene(this); シーン->setItemIndexMethod(QGraphicsScene :: NoIndex); シーン->setSceneRect(0、0、850、480); setScene(シーン); setCacheMode(CacheBackground); setViewportUpdateMode(BoundingRectViewportUpdate); setRenderHint(QPainter :: Antialiasing); setTransformationAnchor(AnchorUnderMouse); scale(qreal(1.0)、qreal(1.0)); setMinimumSize(400、400); } void renderArea :: mousePressEvent(QMouseEvent * event) {{ QPoint p = event-> pos(); updateList(p); } void renderArea :: updateList(const QPoint&p) {{ ポイントポイント; point.point = p; point.isSelected = false; list.append(point); if(list.size()> 1) updateClothoid(list [list.size()-2] .point、list [list.size()-1] .point); } void renderArea :: updateClothoid(const QPoint&p1、const QPoint&p2) {{ クロソイド*temp= new Clothoid(p1、p2); clothoids.append(temp); シーン->addItem(temp); クロソイド曲線を放出(&clothoids); }
ここで、クロソイドは次のように定義されます。
QListクロソイド;
テーブルウィジェット専用の別のクラスのスロットに信号を接続します。
void TableViewList :: onClothoidAdded(QList * clothoids) {{ setRowCount(clothoids-> size()); for(int i = 0; i size(); i ++){ setItem(i + 1、0、new QTableWidgetItem(clothoids-> at(i)-> startCurvature)); setItem(i + 1、1、new QTableWidgetItem(clothoids-> at(i)-> endCurvature)); setItem(i + 1、2、new QTableWidgetItem(clothoids-> at(i)-> clothoidLength)); setItem(i + 1、3、new QTableWidgetItem(clothoids-> at(i)-> sPoint.x()+ "、" + クロソイド->at(i)-> sPoint.y())); setItem(i + 1、4、new QTableWidgetItem(clothoids-> at(i)-> ePoint.x()+ "、" + クロソイド->at(i)-> ePoint.y())); } }
問題は、データがテーブルに挿入されていないことです。デバッグで確認したところ、配列に必要なデータが保持されていることがわかりました。どうすれば正しくアクセスできますか?何か案は?
QTableViewとQStandardItemModelを試してみると、次の問題が発生します。モデルのデータがテーブルに挿入されていません。
renderWidget :: renderingWidget(QWidget * parent): QWidget(親)、 ui(新しいUi :: renderingWidget) {{ ui-> setupUi(this); model.setColumnCount(3); ui-> clothoidTable-> setModel(&model); SpinBoxDelegateデリゲート; ui-> clothoidTable-> setItemDelegate(&delegate); connect(ui-> saveButton、SIGNAL(clicked())、this、SLOT(createClothoid())); } void renderWidget :: createClothoid() {{ model.setRowCount(model.rowCount()+ 1); QModelIndexインデックス=model.index(model.rowCount()、1、QModelIndex()); model.setData(index、QVariant(ui-> lengthSpinBox-> value())); index = model.index(model.rowCount()、2、QModelIndex()); model.setData(index、QVariant(ui-> sCurvSpinBox-> value())); index = model.index(model.rowCount()、3、QModelIndex()); model.setData(index、QVariant(ui-> eCurvSpinBox-> value())); ui-> clothoidTable-> setModel(&model); }
いくつかのテキストボックス/スピンボックスにデータを挿入できるようにしたいのですが、ボタンをクリックすると、データがテーブルに追加されます。ただし、更新されるのは行数のみであり、内部のデータは更新されません。モデルのデータを設定しているときに何か問題がありますか?