2012-03-23 19 views
4

我有一個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(); 
+2

我已經提交了[Qt系統中的錯誤報告](https://bugreports.qt-project.org/browse/QTBUG-24993),因爲這可能是更好的家。我會酌情更新或關閉。 – 2012-03-27 12:41:01

回答

1

QVariant QStandardItem::data (int role = Qt::UserRole + 1) const [virtual]

返回該項目的數據給定角色,或者一個無效的QVariant如果對角色沒有數據。


這裏的論點真的很有趣。模型中的每個項目都包含許多QVariants,這些QVariants維護有關該項目的不同信息。

這些變體全部分配爲roles。任何時候你發出的數據發生了變化,模型必須重繪該項目。重繪它必須查看許多不同的數據塊的條目(下面包括小摘錄)描述的外觀和元數據(具有相關聯的類型)

角色:
常數值描述
Qt的:: FontRole 6中使用的字體針對使用默認代理呈現的項目。 (QFont)
Qt :: TextAlignmentRole 7使用默認代理呈現項目的文本對齊。 (Qt :: AlignmentFlag)
Qt :: BackgroundRole 8用於使用默認委託呈現的項目的背景畫筆。 (QBrush)

+0

你是說:: data()只會被稱爲「n-roles」時間並且爲單個單元格發出dataChanged()?因爲我相信我正在用「n-columns」調用「n-roles」數來觀察「n-rows」。如果我能拿出一個我正在觀察的小例子,然後從中繼續下去,這可能是最好的。當我有這個時,我會重新發布。 – 2012-03-26 12:31:04

+0

我用一些示例代碼更新了我的原始帖子,這些代碼說明了我相信我正在觀察的問題。對我來說,問題是發射dataChanged()旨在更新單個單元格會生成大量的對:: data()的調用。 – 2012-03-26 13:54:05

相關問題