动态添加数据到QTableView

aj3*_*423 6 qt row append tableview

我正在写一个简单的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_;
....
Run Code Online (Sandbox Code Playgroud)

如何动态地向模型添加行?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);
Run Code Online (Sandbox Code Playgroud)

这似乎是低效的setData,因为在追加一行时调用两次,因为有两列,并且将来可能会有更多列.

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

谢谢.

Chr*_*ris 7

我不确定你为什么觉得它效率低下.但是你可以让它变得更简单.

我可能会编写这样的函数,这样可以更好地预测列数和类型的更改:

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

    foreach(const QVariant &item, data) {
        setData(createIndex(row, 0), item, Qt::EditRole);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

model.my_append_data(QVariantList() << "11111" << 111);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不明白为什么这段代码比有问题的代码更好,我想说它甚至更糟。IMO我的答案要好得多。 (2认同)

Mar*_*k R 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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