4

QTableView と、対応する QAbtractTableModel の子のインスタンスがあります。

テーブル モデル インスタンスが 1 つのセルを指定する dataChanged を発行すると、Qt フレームワークがテーブル モデルの ::data() メンバー関数に対して多数の呼び出しを発行することに驚きました。これらの呼び出しの行/列の範囲は、画面上にあるものの範囲全体 + 余分なものをカバーしているように見えます。

これは私が予想した以上のものです。単一のセルに名前を付ける dataChanged() は、そのセルのデータを要求する ::data() 呼び出しのみになると考えていました。結局のところ、私のテーブル モデルが変更されたと言った唯一のセルです。しかし、Qt フレームワークは非常に群生しているようで、すべてのセルについて問い合わせます。

私は明らかに dataChanged() シグナルの意図を理解していません。

QTableView に 1 つのセルと 1 つのセルのみを更新するように指示する方法はありますか?

更新: コード サンプルを含む ここの例は、テーブルを作成するためのヘッダー、ソース、およびコードのチャンクです。私の場合、テーブルは 12 列 29 行で表示されます。最後の「issueEmit」呼び出しの後、::data は、1 つのセルに対する dataChanged() シグナルのために、全部で 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();
4

1 に答える 1

1

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

指定された役割の項目のデータを返します。役割のデータがない場合は無効な QVariant を返します。


ここで興味深いのは議論です。モデル内の各アイテムは多数の QVariants を保持し、これらの QVariants はアイテムに関するさまざまな情報を維持します。

これらのバリアントにはすべて役割が割り当てられています。データが変更されたことを発行するたびに、モデルはアイテムを再描画する必要があります。アイテムを再描画するには、さまざまなデータを調べる必要があります (以下に小さな抜粋を示します)。

外観とメタ データを記述するロール (関連付けられた型を含む):
定数 値 説明
Qt::FontRole 6 デフォルトのデリゲートでレンダリングされるアイテムに使用されるフォント。(QFont)
Qt::TextAlignmentRole 7 デフォルトのデリゲートでレンダリングされたアイテムのテキストの配置。(Qt::AlignmentFlag)
Qt::BackgroundRole 8 デフォルトのデリゲートでレンダリングされたアイテムに使用される背景ブラシ。(Qブラシ)

于 2012-03-23T22:17:53.307 に答える