2011-12-21 15 views
3

PresetTableModelというQAbstractTableModelを作成し、QTableViewに接続しました。 rowCountcolumnCount、データ関数を実装しました。 rowCountが固定数を返す場合はすべて動作しますが、変数値を返すとすぐにリストビューに行が表示されません。次のコードのdebugステートメントは、0から始まるサイズ値を示しますが、リストに値が設定されると9に変更されます。QTableViewの行数が更新されないのはなぜですか?

int PresetTableModel::rowCount(const QModelIndex & /*parent*/) const 
{ 
    qDebug() << preset_list.count(); 
    return preset_list.size(); 
} 

強制的に行数を更新する必要がありますか?

+0

qDebugで同じ関数を呼び出してステートメントを返さないのはなぜ? – Karlson

+0

ありがとうKarlsonはそれを試みたが差はなかった。 –

+0

これを試してください:あなたのリストの長さを変数に設定し、それを返そうとしてください。これが何か違いがあるかどうかを見てください。私はなぜそれがしようと怪我をしないだろうか分からない。 – Karlson

答えて

6

基礎となるデータを変更する場合は、モデルの通知メカニズムを使用してビューに通知する必要があります。データ追加時に例えば、:したがって

beginInsertRows(QModelIndex(), preset_list.size(), preset_list.size()+1); //notify that two rows will be appended (rows size() and size() + 1) 
preset_list.append(something); 
preset_list.append(somethingelse); 
endInsertRows(); //notify views that you're done with modifying the underlying data 

を、あなたは行を削除するときbeginRemoveRows()とendRemoveRows()を呼び出して、既存のエントリが更新されるとdataChanged()を放出しなければなりません。サイドノートでは

、あなたをrowCount()メソッドは、深さを制限するために

if (!parent.isValid()) 
    return preset_list.size(); //top-level: return list size 
else 
    return 0; //list item: no further children (flat list) 

をお読みください。それ以外の場合は、リスト内の各項目にはpreset_list.size()の項目が再度あります。

0

私が使用します。

void refresh() { 
    emit dataChanged(index(0, 0), 
        index(rowCount(), columnCount())); // update whole view 
    emit layoutChanged(); 
    } 
+0

これは機能しますが、使用する必要があります。 emit dataChanged(index(0、0)、index(rowCount()-1、columnCount()-1));値がカウントではなくインデックスであるため、 が代わりに使用されます。 – Ph0t0n

関連する問題