私はQTableView
を使用して読み取り専用データを表示します。このモデルは、別のQList
を含むカスタムタイプのQList
に基づいています。このような何か:例えば、QTableView:オンザフライでrowCountを変更
void setCurrentItem(int idx)
{
// checks for errors (omissis)
currentItemIdx = idx;
// ask to redraw the table
emit dataChanged(this->index(0, 0), this->index(rowCount(), columnCount()));
}
すべてのモデルのロジックがその項目に依存している:私のQAbstractTableModel
実装で
typedef struct
{
int range;
QString description;
} Field;
typedef struct
{
QString name;
QList<Field> fields;
} Item;
QList<Item> items;
私は現在item
選択のスロットを持ってい
int MyModel::rowCount(const QModelIndex&) const {
return items.at(m_currentItemIdx).fields.count();
}
QVariant MyModel::data(const QModelIndex &index, int role) const {
if (!index.isValid()) return QVariant();
if (index.row() >= items.at(m_currentItemIdx).fields.count()) return QVariant();
Field f = items.at(m_currentItemIdx).fields.at(index.row);
switch (role) {
case Qt::DisplayRole:
switch (index.column()){
case 0:
return f.range;
break;
case 1:
return f.description;
break;
default:
return QVariant();
}
break;
}
return QVariant();
}
問題は、現在の項目をsetCurrentItem()
で変更するとコードで新しいデータが使用されますが、QTableView
はそのデータを変更しません新しいコンテンツを要求しません。
私はemit dataChanged()
が十分だと思いましたが、そうは思われません。 モデルのサイズを変更したことをビューに通知するにはどうすればよいですか?
私はQList
の実際のデータを変更したくないので、挿入/削除行のメカニズムを避けようとしています。別の情報を取りたいだけです。
あなたは完全にあなたのテーブルのデータを更新しているので、私が思うに、呼び出し 'QAbstractItemModel ::リセット()'あなたが欲しいものを実行します。私。 'void setCurrentItem(int idx){currentItemIdx = idx;リセット(); } ' – vahancho