动态添加数据到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类型)可以隐式转换为QVariant
s,因此不需要调用QVariant::fromValue()
此外,如果你使用Qt,你通常会使用QString
s,而不是std::string
s。
另一答案
你的代码很奇怪!当您继承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) [已解决]