动态添加数据到QTableView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态添加数据到QTableView相关的知识,希望对你有一定的参考价值。

我正在写一个简单的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被调用两次,因为有两列,并且将来可能会有更多的列。

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

谢谢。

答案

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

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

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。

另一答案

你的代码很奇怪!当您继承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​​设计用于视图以在模型上操作。这会产生不必要的开销

以上是关于动态添加数据到QTableView的主要内容,如果未能解决你的问题,请参考以下文章

动态添加 QTableView 到动态创建的标签页 (QTabWidget) [已解决]

将片段添加到片段中(嵌套片段)

如何将 qdate 添加到 qtableview

将按钮添加到 QTableview

使用 WindowManager.addView 添加动态视图

QTableView如何设置行高?