1

モデルからにデータを挿入しようとしてTableViewいますが、データが挿入されていないため、何か問題が発生しています。ただし、テーブルは列と行で更新されます。

だから私はGraphicsViewいくつかのカスタムを描いているところがありますGraphicsItems。新しいアイテムがシーンに追加されるたびに、モデルは更新されTableView、データを挿入するように信号を送信することになっています。

ここでは、新しいアイテムが追加されたときにモデルを更新します。

    Clothoid * temp = new Clothoid();
        temp-> setStartPoint(p1);
        temp-> setEndPoint(p2);

        clothoids.append(temp);

        シーン->addItem(temp);

        model.setColumnCount(3);
        model.setRowCount(clothoids.size());

        QModelIndex index = model.index(clothoids.size()、1、QModelIndex());
        model.setData(index、clothoids.last()-> startCurvature);
        index = model.index(clothoids.size()、2、QModelIndex());
        model.setData(index、clothoids.last()-> endCurvature);
        index = model.index(clothoids.size()、3、QModelIndex());
        model.setData(index、clothoids.last()-> ClothoidLength);

        クロソイドを放出する追加(&model);


私のカスタムgraphicsItemsのリストであるクロソイド:

QList<クロソイド*>クロソイド;

信号はメインウィンドウのスロットに接続されています。

   

    ui-> setupUi(this);    
        SpinBoxDelegateデリゲート;
        ui-> clothoidTable-> setItemDelegate(&delegate);

        connect(ui-> graphicsView、SIGNAL(clothoidAdded(QStandardItemModel *))、ui-> clothoidTable、SLOT(onClothoidAdded(QStandardItemModel *)));


スロットは次のとおりです。

    void TableViewList :: onClothoidAdded(QStandardItemModel * model)
        {{
            setModel(model);
        }

私は何が間違っているのですか?

4

1 に答える 1

2

setData()を直接呼び出す必要はありません。実行する必要のあるいくつかの重要な手順は次のとおりです。

  • Clothoidモデルは、ポインターのコンテナー(おそらくQList)を保持する必要があります(リソースの解放を担当するかどうかは関係ありません)。コンテナへのインデックスは、ビュー内で占める行に直接マップする必要があります。

  • data()とを正しくsetData()実装する必要があります。これにより、モデルは、特定の行の各セルにどのクロソイド情報が入るかを知ることができます。次のように、列番号を表すswitch()ステートメントが必要です。enum


// in data() after the usual error checking, etc
if(role == Qt::DisplayRole)
    {
    Clothoid* cloth = myListOfClothoids.at(index.row());
    switch(index.column())
        {
        // This enum is defined in the header for the Clothoid class 
        //  and represents the COLUMN NUMBER in which to show the data
        case Clothoid::START: 
            return cloth->startCurvature; // these probably shouldn't be public members btw
        case Clothoid::END:
            return cloth->endCurvature;
        case Clothoid::LENGTH:
            return cloth->clothoidLength;
        }
    }

// in setData()
if(role == Qt::DisplayRole)
    {
    Clothoid* cloth = myListOfClothoids.at(index.row());
    switch(index.column())
        {
        case Clothoid::START: 
            cloth->startCurvature = variant.toWhatever(); 
            break;
        case Clothoid::END:
            cloth->endCurvature = variant.toWhateverElse(); 
            break;
        case Clothoid::LENGTH:
            cloth->clothoidLength = variant.toYetSomethingElse();
            break;
        default:
            return false;
        }
    emit dataChanged(index,index);
    return true;
    }
  1. モデルにはaddClothoid()関数が必要です。この関数では、次のようなことを行います。

int rowIndexFirst = 0; // insert into first row
int rowIndexLast = rowIndexFirst; // only inserting one row/Clothoid
beginInsertRows(QModelIndex(), rowIndexFirst, rowIndexLast);
myListOfClothoids.prepend(newClothoidPtr); // insert clothoid into first index, as well
endInsertRows(); // begin and end take care of signalling the view for you!

私は本当にこれを行うことをお勧めします。はい、この程度までリファクタリングするのは大変な作業ですが、それだけの価値はあります。私を信じてください。

お役に立てれば。

于 2011-08-04T14:01:07.047 に答える