2017-08-08 13 views
1

私は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の実際のデータを変更したくないので、挿入/削除行のメカニズムを避けようとしています。別の情報を取りたいだけです。

+1

あなたは完全にあなたのテーブルのデータを更新しているので、私が思うに、呼び出し 'QAbstractItemModel ::リセット()'あなたが欲しいものを実行します。私。 'void setCurrentItem(int idx){currentItemIdx = idx;リセット(); } ' – vahancho

答えて

3

モデルデータを変更した後にQAbstractItemModel::​beginResetModel()QAbstractItemModel::​endResetModel()を呼び出してください。このよう

void setCurrentItem(int idx) 
{ 
    beginResetModel(); 
    currentItemIdx = idx; 
    endResetModel(); 
} 
関連する問題