我有一個QTableView和QAbtractTableModel的子對應實例。在許多::數據調用中發射dataChanged(createIndex(1,1),createIndex(1,1))結果
我很驚訝地看到,如果我的表模型實例發出命名單個單元格的dataChanged,那麼Qt框架將對我的表模型的:: data()成員函數發出大量調用。這些調用的行/列範圍似乎覆蓋了屏幕上的內容+一些額外的範圍。
這比我預想的要多。我曾想過一個名爲單個單元格的dataChanged()只會導致:: data()調用請求該單元格的數據。畢竟,這是我的表模型所說的唯一一個單元格。但是Qt框架似乎非常合羣,並且詢問了所有的細胞。我清楚地明白dataChanged()信號的意圖。
有沒有辦法告訴QTableView更新一個單元格和一個單元格而沒有發送到我的表格模型的所有額外顫音?
更新:包括代碼示例 這裏的示例是一個標題,源代碼和一塊代碼來創建表。對我來說,表格顯示了12列和29行。在最後的「issueEmit」調用之後,由於單個單元格的dataChanged()信號,:: data將被調用1044次。
// Declaration
#include <QAbstractTableModel>
class SimpleModel : public QAbstractTableModel
{
Q_OBJECT
private:
bool _post_emit;
public:
explicit SimpleModel(QObject *parent=0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void issueEmit();
};
// Implementation
#include <stdlib.h>
#include <stdio.h>
#include "simplemodel.h"
SimpleModel::SimpleModel(QObject *parent) : QAbstractTableModel(parent), _post_emit(false) { }
int SimpleModel::rowCount(const QModelIndex &parent) const {
return 100;
}
int SimpleModel::columnCount(const QModelIndex &parent) const {
return 100;
}
QVariant SimpleModel::data(const QModelIndex &index, int role) const {
if (role==Qt::DisplayRole) {
if (_post_emit) {
static unsigned s_calls=0;
s_calls++;
printf("Data calls: %d\n",s_calls);
}
return ((rand()%10000)/1000.00);
}
return QVariant();
}
void SimpleModel::issueEmit() {
_post_emit=true;
emit dataChanged(createIndex(1,1),createIndex(1,1));
}
// Usage
QTableView *table=new QTableView;
table->setMinimumSize(1200,900);
SimpleModel *model=new SimpleModel;
table->setModel(model);
table->show();
model->issueEmit();
我已經提交了[Qt系統中的錯誤報告](https://bugreports.qt-project.org/browse/QTBUG-24993),因爲這可能是更好的家。我會酌情更新或關閉。 – 2012-03-27 12:41:01