問題タブ [qabstractitemmodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
expand - Qt: フィルタリングを使用した ProxyModel、QTreeView、およびデリゲート セットアップが正しく更新されない
親行の値 (QStyledItemDelegate 派生クラスを介して QComboBox で選択) の値に応じて行のみを受け入れる、filterAcceptsRow() でカスタム フィルタリングを使用して QSortFilteredProxyModel を表示する QTreeView をセットアップしました。たとえば、行で「Type " 値 "BMW", この特別なケースの子を表示したい. これは最初のアイテムに最適です. Item1 の複数レベル下 (最大 5 レベル) 内でこれらの値を選択できます. すべてがうまく機能します.
ただし、item1 とこのカスタム フィルタリングを試してから item2 を追加すると、問題が発生することに気付きました。最初に気付いたのは、QTreeView が item1/item2 の共通の親を展開解除し、ルート アイテムの子のみを表示することです。通常の動作 (および item1 を追加するときの動作) は、item1 の親を展開することです。これが 2 番目の項目で混乱する理由は、item1 の子設定で遊んでいる場合のみです。また、item2 でフィルタリングが正しく機能しないことに気付きました。item2->Type に QComboBox があり、item2->Type の値に応じて子を持ちます。QComboBox のデフォルト値の最初の子は、本来のように表示されますが、QComboBox を変更すると、ビューは更新されなくなり、 item2/item3/... 内のこの最初にロードされた子にとどまります ただし、Delegate::setModelData は正しい値/インデックスで呼び出され、それに応じて TreeItem->setData() を呼び出します。フィルタリングが TreeItem->data() の古い値に固執しているように見えるだけです。繰り返しますが、これは item1 で遊んだ後にのみ発生することに注意してください。そのアイテムをそのままにしておくと、他のすべてのアイテム (item2、item3、...) で正しくプレイでき、問題なく動作します。
誰かが助けてくれたらとてもうれしいです。
expand() が item1 と item2 の挿入で同じように呼び出され、 item1 でうまく機能するにもかかわらず、expandedStates の「リセット」を引き起こす可能性があるのは誰ですか? 何がさらに問題を引き起こす可能性がありますか?
ExampleDelegate.h
ProxyModel.h
ProxyModel.cpp
c++ - QTreeViewがデータを表示しない
QAbstractItemModelから派生して、独自のデータツリーをエンコードしましたが、QTreeViewが表示されません。
同様の質問に対して私が見た回答のほとんどは、可変寿命が間違っていたために解決されたので、モデルを割り当てるためのコードは次のとおりです。
構築時に、モデルはルートノードにデータを入力し、後で必要に応じて(を介してfetchMore
)さらにデータをロードします。
呼び出されるすべての関数を出力し始めました。これは、呼び出しシーケンスのログです。
の出力roleNames()
:
その後、最後の4行が永久に繰り返されます(または少なくとも忍耐力を失うまで)。私には、ルートデータがフェッチされているように見えますが、表示されることはありません。data
奇妙なことに、 -の最後のパラメーターであるはint role
、値13を持ち、これはどの役割としても定義されていません(それでも、有効な文字列を無条件に返します)。
これを実装するときに見逃したことはありますか?
c++ - QTreeView での行の挿入と削除
こんにちは、私はQAbstractItemModelから継承されたベースモデルと、このモデルに時々通知するいくつかのバックグラウンドスレッドを持っています.例では、挿入行はこのようなものを実装しています
しかし、私のモデルは 4 つのビューを使用する単一であるため、このようにすることはできません。挿入を次のように実装しました。
s_notify
実装のあるクラスはどこにありますか:
これを考慮して、次のメソッドを呼び出します。
行の削除は完全に機能しますが、挿入は機能しません。私の実装で何が問題になっていますか?
c++ - Qt::UserRole を挿入すると QAbstractItemModel->setItemData が false を返す
Qt::UserRole
アイテムに挿入しようとするQTreeView
と常に false が返される理由がわかりませんが、入力すると返されないQt::EditRole
のは次のコードです。
qt - PySide(PyQt)QAbstractItemModel
ツリービューの単純なモデルを実装しようとしていますが、なぜ機能しないのかわかりません。3つは最初の子の子である必要がありますが、すべてのノードがルートノードの子であるようです。また、私のメソッドが無限ループに入っていることがわかります。助けていただければ幸いです。hasChildren
これが私のコードです:
c++ - メソッドクラッシュによるQTreeViewinsertRows/直接呼び出しは機能します
私は次の奇妙な問題を抱えています。
ツリービューに子ノードを挿入できるようにQAbstractItemModelを実装しましたが、insertRows()メソッドを使用してノードを追加しようとすると奇妙なことが発生します。
最初にすべてが呼ばれる場所:
これは、rootNode.log()呼び出しからの出力です。
ご覧のとおり、「Potato」ノードは正しく挿入されています。
画像を見る http://www10.pic-upload.de/04.01.13/m65huuqq4ruu.png
しかし、childNode1ノードを展開しようとすると、クラッシュします。しかし、上記のコードの最後のコメントを見てください。私が述べたように->ツリービューを今すぐ出力しようとすると(すべてのノードを反復処理します)、クラッシュします。
メソッドが呼び出されると、すべてが正常であるように見えます-ツリービューを消費しようとすると、クラッシュします->デバッグ出力により、すべてが正常であると考えられます
実際のエラーメッセージは、位置で読んでいるときのアクセス違反です...(ドイツ語から翻訳-英語で同じように呼ばれているかどうかはわかりません)
}
上記のメソッドのデバッグ出力:
デバッグ出力が正しいように見えるため、なぜこれが発生するのかわかりません。基本的には、insertChildメソッドを介してノードを直接挿入するのと同じである必要があります。
なぜそれが機能しないのか誰かが知っていることを願っています。
よろしく、マイケル
qt - Qt - チェックボックス列を持つ QTreeView とカスタム モデル
アイテム名、アイテムの説明、および関連する 2 つのブール値をそれぞれの列に表示するツリー ビューが必要でした。編集可能なツリー モードの例を変更することから始めたので、TreeItem のグループを追跡する TreeModel があり、それぞれに子 TreeItem のリストだけでなく、後で使用できる一連の値を格納する QVariants のリストもあります。 QTreeView の列に表示されます。
2 つのブール値に対してさらに 2 つの列を追加することができました。また、QTreeView と QAbstractItemModel のチェックボックスを追加する方法についてネットを検索しました。2 つのブール列のチェックボックスと、ツリー階層の残りの部分が正常に機能するようになりました。それでも、各列のすべてのアイテムは、チェックボックスとテキスト行をレンダリングします。
主に TreeModel 内で、例から変更した部分を次に示します。
ツリーモデル.cpp:
メインウィンドウ.cpp:
非ブール列の下のチェックボックスはユーザー入力に応答せず、ブール列の下のテキストは編集できません。機能的には問題ありませんが、UIに関してはまだ面倒です.
私は QTreeWidget に同じことをさせようとしています。その間、他に何か足りないものはないかと考えずにはいられませんでした。解決策の 1 つは、カスタム デリゲートを使用することだと聞きました。それが唯一の選択肢ですか?
私が他に何をする必要があるかを指摘したり、同様の例を提供したりできる人がいれば、私はそれを大いに感謝します.
qt - QAbstractItemModel -- リセットされていますか? QItemDelegate::paint() が呼び出される頻度が高すぎる
これは私を夢中にさせています。QAbstractItemModel、QSortFilterProxyModel、および QStyledItemDelegate があります。すべてサブクラス化されます。次の dataChanged() を発行した後、QStyledItemDelegate::paint() をこれら 2 つのインデックス (0,0、および 0,1) に対してのみ呼び出す必要があります。ただし、表示されているすべてのセルに対して呼び出されていることを確認しました。
確かに、モデルとプロキシの modelReset() および layoutChanged() シグナルの両方にスロットを接続しました。単純な printf() を実行します。ただし、呼び出されることはありません。ビューやデリゲートでファンキーなことは何もしていないと確信しています。しかし、どこを見ればよいか正確にはわかりません。
qt - 外部ソースを使用して QAbstractItemModel に変更通知を実装する
QAbstractItemModel
外部から変更できるデータを表す を実装しています。私のモデルは、変更が発生した後に変更されたデータに関する通知を受け取りますが、変更が発生する前に通知を受け取る方法がありません。モデルに変更が通知されるまでに、古いデータは利用できなくなります。
私がドキュメントを理解している限り、メソッドbeginInsertRows
などbeginRemoveRows
は変更前に呼び出す必要がありますが、古いデータはまだ利用可能です。
私の理解は正しいですか?もしそうなら、私の代替手段は何ですか?
c++ - ModelResetter RAII オブジェクト
新しい列/行がソース モデルに追加されると、それ自体がオーバーホールされるカスタム プロキシ モデルがあります。ドキュメントから、そのような操作の開始時と終了時に QAbstractItemModel ::beginResetModel() とQAbstractItemModel::endResetModel( ) を呼び出すことが適切な方法であるように見えます。endResetModel
残念ながら、私のオーバーホール関数にはいくつかの出口点があり、複雑になるにつれてすべての出口点で呼び出すのを忘れてしまうことがわかっています。
beginResetModel
したがって、次のように、構築を呼び出しendResetModel
てから破棄を呼び出す単純な RAII クラスを作成したいと思います。
問題は、beginResetModel()
とendResetModel()
の両方が にあることprotected
ですQAbstractItemModel
。基本クラスと対話しようとしているので、継承ModelResetter
されたモデルで として宣言しても役に立たないようです。friend class
実装するモデルごとにカスタム実装を行いたくないので、テンプレートでこれを行うことはできますか? 私はまだテンプレートの構文にあまり慣れていません。
編集 1: (混乱を避けるために、編集 2 のサンプル テンプレート コードを削除しました)
を継承する型のみを許可するようにテンプレートを何らかの形で制限できればいいのですが、それを許可するQAbstractItemModel
標準 C++ には何もありません。ブーストは使用しません。
編集 2 : 私は自分の要件について本当に明確ではなかったと思います。どうぞ:
- 一般的なケースの基本クラスで動作します
QAbstractItemModel
リリース モードでのペナルティなしに、デバッグ モードで継承要件を強制します。- オーバーヘッドがほとんどないシンプルな使い方
- 基本クラスや新しい関数の変更は不要