0

ユーザーが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);
    }

いくつかのテキストボックス/スピンボックスにデータを挿入できるようにしたいのですが、ボタンをクリックすると、データがテーブルに追加されます。ただし、更新されるのは行数のみであり、内部のデータは更新されません。モデルのデータを設定しているときに何か問題がありますか?

4

1 に答える 1

0

これは聞き取りにくいですが、QTableWidgetコンビニエンスクラスから離れたいと思います。

Qtが実際にあなたのような複雑なテーブルを処理することをどのように意図しているかについては、Qtモデル/ビュープログラミングのこのリンクを確認してください。

モデル/ビューの私の2セントはこれです:

  1. QTableViewの代わりに使用してくださいQTableWidget
  2. サブクラスQAbstractItemModel化して実装data()(読むため)、およびドキュメントから必要な他のすべての関数。これは最も難しい部分ですが、これを行う方法のウォークスルーについては、上記のリンクを参照してください。
  3. setModel()QTableViewサブクラス化されたモデルへの。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2011-08-02T13:23:33.340 に答える