7

我正在写一个简单的TableView根据

http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-addressbook.html

class MyModel : public QAbstractTableModel {
    Q_OBJECT
public:
    QList<QPair<string, int> > data_;
....

如何动态向模型添加行?data_.insert(..)不会改变视图,目前我编写了一个函数来追加新行:

void my_append_data(const string& first, int second) {
    int row = rowCount(QModelIndex());
    insertRow(row); // insert a empty row
    // fill the row
    setData(createIndex(row, 0), QVariant::fromValue<string>(first), Qt::EditRole);
    setData(createIndex(row, 1), QVariant::fromValue<int>(second), Qt::EditRole);
}
// usage
model.my_append_data("11111", 111);
model.my_append_data("22222", 222);

这似乎效率低下setData,因为追加一行时调用了两次,因为有两列,将来可能会有更多列。

有更好的方法来追加行吗?

谢谢。

4

2 回答 2

7

我不确定你为什么认为它效率低下。但是你可以让它更简单

我可能会像这样编写您的函数,这将使它在未来更能证明对列数和类型的更改:

void my_append_data(const QVariantList &data) {
    insertRow(rowCount(QModelIndex()));

    foreach(const QVariant &item, data) {
        setData(createIndex(row, 0), item, Qt::EditRole);
    }
}

用法:

model.my_append_data(QVariantList() << "11111" << 111);

Basic(和大多数 Qt 类型)可以隐式转换为QVariants,因此无需调用QVariant::fromValue()

此外,如果您使用 Qt,您通常会使用QStrings,而不是std::strings。

于 2013-11-15T05:16:32.510 回答
5

你的代码很奇怪!当您对数据进行子类QAbstractTableModel化并对数据(在您的data_)进行一些操作时,您只需发出正确的信号(或调用一些受保护的方法来发出此类信号)以通知视图模型中的某些内容发生了变化!

因此,在您的情况下,它应该类似于:

void my_append_data(const string& first, int second) {
    int newRow = data_.count();
    beginInsertRows(QModelIndex(), newRow, newRow);
    data_.append(QPair<string, int>(first, second));
    endInsertRows();
}

如果您模型的其他部分正确编写,它应该可以完美运行。

在其他答案中编写的代码只是使用旨在供视图用于对模型进行操作的 API。这会产生不必要的开销。

于 2013-11-15T09:46:10.927 回答