8

で現在表示されているアイテムのリストを取得する方法はありますQAbstractItemViewか? また、可能であれば、このリストの変更に関する通知を受け取ります。

Upd:ではなく、単純でない構造についてQAbstractItemView、またはそれを使用して正確に質問しています。QTreeViewQTableView

Upd2: チェックボックス付きのツリー ビュー モデルを実装しています。次の動作が必要です(チェック/チェック解除も同じ):

  • チェックボックスの1つがチェックされている場合 - すべての子をチェックする必要があります
  • すべての子チェックボックスがチェックされている場合、親チェックボックスもチェックする必要があります。親の親などについても同じです...

チェック状態は外部データ ソースによって監視/変更されるため、変更されたすべての子/親を更新するメカニズムが必要です。更新のためにdataChanged変更されたすべてのリストを作成するのは非常に広大であるため、シグナルは私にとって十分ではありません。QModelIndexまた、新しいデータはすべて から取得されるため、まったく必要ありませんQAbstractItemModel::data

すべてのアイテムを更新するための次の汚いハックを見つけましemit dataChanged( QModelIndex(), QModelIndex() );たが、無効なインデックスについては文書化されていません。

したがって、表示されているすべてのアイテムを新しいデータで強制的に再描画する方法が必要です。

4

5 に答える 5

12

次のように呼び出すことで、左上と右下のセルを取得できます。

tableview->indexAt(tableview->rect().topLeft())
tableview->indexAt(tableview->rect().bottomRight())

変更の通知を受け取るには、qabstractscrollarea の仮想関数を再実装します

scrollContentsBy

この関数は、ビュー ポートがスクロールされたときに呼び出されます。QTableView::scrollContentsBy を呼び出してから、必要なことをすべて行います。

于 2013-04-04T17:44:20.143 に答える
4

の場合QTreeView、可視アイテムのリストは次のようにトラバースできます。

QTreeView& tv (yourTreeView);

// Get model index for first visible item
QModelIndex modelIndex = tv.indexAt(tv.rect().topLeft());

while (modelIndex.isValid())
{
    // do something with the item indexed by modelIndex
    ...
    // This navigates to the next visible item
    modelIndex = tv.indexBelow(modelIndex);
}
于 2014-03-13T19:58:54.777 に答える
0

可視項目のリストが必要になるケースは少ないと思います。モデルが正しく実装されている場合、すべての項目が自動的に更新されます。実装の難しい部分 - 子と親に更新を強制します。私は次のコードを書きました:

bool TreeModel::setData( const QModelIndex &index, const QVariant &value, int role )
case Qt::CheckStateRole:
        {
            TreeItemList updateRangeList;  // Filled with items, in which all childred must be updated
            TreeItemList updateSingleList; // Filled with items, which must be updated
            item->setCheckState( value.toBool(), updateRangeList, updateSingleList ); // All magic there
            foreach ( TreeAbstractItem *i, updateRangeList )
            {
                const int nRows = i->rowCount();
                QModelIndex topLeft = indexForItem( i->m_childs[0] );
                QModelIndex bottomRight = indexForItem( i->m_childs[nRows - 1] );
                emit dataChanged( topLeft, bottomRight );
            }
            foreach ( TreeAbstractItem *i, updateSingleList )
            {
                QModelIndex updateIndex = indexForItem( i );
                emit dataChanged( updateIndex, updateIndex );
            }
        }
于 2013-04-08T09:01:44.227 に答える