1

我试图TableView从模型中插入一些数据,但我做错了,因为没有插入数据。该表虽然更新了列和行。

所以我有一个GraphicsView我正在绘制一些自定义的地方GraphicsItems。每次将新项目添加到场景中时,模型都应该更新并向我发送信号以TableView将数据也插入其中。

在这里,我在添加新项目时更新模型:

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

        clothoids.append(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);

        发出clothoidAdded(&model);


Clothoids 是我的自定义图形项的列表:

QList < Clothoid *> 回旋曲线;

信号连接到我的主窗口中的插槽:

   

    ui->setupUi(这个);    
        SpinBoxDelegate 委托;
        ui->clothoidTable->setItemDelegate(&delegate);

        连接(ui->graphicsView,SIGNAL(clothoidAdded(QStandardItemModel*)),ui->clothoidTable,SLOT(onClothoidAdded(QStandardItemModel*)));


插槽在哪里:

    无效 TableViewList::onClothoidAdded(QStandardItemModel *model)
        {
            设置模型(模型);
        }

我究竟做错了什么?

4

1 回答 1

2

您不想直接调用 setData() 。以下是您需要采取的几个关键步骤:

  • Clothoid您的模型应该包含一个指针容器(可能是 QList)(无论它是否负责释放资源)。容器的索引应该直接映射到它在视图中占据的行。

  • 您需要正确实施data()setData()以便模型知道给定行的每个单元格中的 Clothoid 信息。他们应该有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 回答