問題タブ [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.
qt - 列を交換するプロキシ モデルを設定すると、カスタム階層モデルが正しく表示されない
QAbstractModelItem から継承したカスタム階層モデルがあります。また、QSortFilterProxyModel からサブクラス化された MySortFilterProxyModel を実装します。MySortFilterProxyModel は、列を削除および交換できます。MySortFilterProxyModel の最初の列がモデルの最初の列に対応する場合、すべて正常に動作します。しかし、プロキシ モデルでスワップされた場合、ビューにいくつかの問題があります。しかし、展開しようとすると、子アイテムは表示されません。MySortFilterProxyModel メソッドの一部を次に示します。
デバッグ中に、 MySortFilterProxyModel::rowCount が正しいデータを返すことがわかりました。しかし、MyModel::rowCount は MySortFilterProxyModel::rowCount ではなく、QSortFilterProxyModel::index() から呼び出されることにも気付きました。それが問題なのですか?
したがって、特定の質問は、階層モデルで列を交換およびスイッチオフするためのプロキシモデルを実装する正しい方法は何ですか?
問題を解決するために私を助けてください。ありがとうございました。
c++ - ソースモデルを介してフラグを返すと、アイテムが非アクティブになります(グレー表示)
フラグ仮想メソッドにベースQSortFilterProxyModel
を持つ私のプロキシモデルでは:
関数が上記のようになっている場合(モデルバージョンと同じです...コピーして貼り付けただけです)、アイテムは正しく表示されます。しかし、このメソッドのdefをsourceModel()を使用するように変更すると:
...その後、listViewのアイテムは非アクティブになります。なんで?
qt - 外部モデルの変更
を通して表示したいツリー (シーン グラフ) がありますQTreeView
。SceneGraphModel
のサブクラスでQAbstractItemModel
あり、ツリーを表示するために必要なすべてのメソッドを実装し、参照先QModelIndexS
へのポインターを渡しNode
ます。
SceneGraph
直接操作しようとするまで、これはかなりうまくいきました。ツリービューが無効になっNode
たポインターをQModelIndex
.
SceneGraph
を介して のすべての操作を行う必要がありSceneGraphModel
ますか? これを回避する方法はありますか?
qt - QAbstractListModelおよびQListアダプター
私のアプリケーションは、オブジェクトから継承するタイプのいくつかのオブジェクトを格納し
QAbstractListModel
ます。
std::vector<T>
これにより、単純なモデルまたはQList<T>
一般的な追加、削除、および複数選択機能を備えたモデルにラップするときに、非常に多くの重複コードが生成さ
れます。
その方法QAbstractListModel
が使用されることになっているのですか、それとも重複したコードを削除できるアダプタークラスがありますか(少なくともQtの一部であるコンテナーの場合)?
例:モデルにラップvector<ObjectA>
して入れたい。、などvector<ObjectB>
のコードは常に同じであり、それを統合したいと思います(とでさえも機能する可能性のある少しのメタプログラミングを使用して)。insertRows
deleteRows
columnCount
tuple
data
python - データソースを並べ替えた後、QAbstractTableModelとQTableViewを更新するにはどうすればよいですか?
QTableViewを使用してPyQtアプリケーションに表示したいカスタムデータ構造があります。QAbstractTableModelのサブクラスを使用してデータと通信しています。データ構造自体は別のモジュールにあり、PyQtについては何も知りません。
QTableViewを使用したデータの表示と編集は機能しますが、データを並べ替えてから、モデルとビューを更新したいと思います。
QAbstractTableModelとその祖先QAbstractItemModelのQtドキュメントを読んだ後、私の最初のアプローチはこれを試すことでした。
ただし、これはビューの更新に失敗します。また、モデルで使用されているすべてのデータでdataChangedシグナルを発行しようとしましたが、これでもビューを更新できませんでした。
私はさらに調査を行いました。私が正しく理解していれば、問題はモデルのQPersistentModelIndexesが更新されていないことであり、解決策はそれらを何らかの方法で手動で更新することです。
これを行うためのより良い方法はありますか?そうでない場合は、どのように更新しますか(できれば、すべてのインデックスの変更を追跡する新しい並べ替え関数を作成する必要はありません)。
c++ - QAbstractItemModel:モデルに多数のアイテムを挿入するのが非常に遅いのに、なぜdataChangedを発行して行シグナルを挿入するのですか?
StackoverflowのすべてのQtモデル/ビュープログラミングの達人にこんにちは。私が取り組んでいるプロジェクトでは、XMLデータのQAbstractItemModelから派生したモデルを定義する必要があります。このモデルの実装中に問題が発生したときに、以前にここで質問をしました 。ソースモデル関数を介してソースモデルから行を削除すると、QSortFilterProxyModelがクラッシュします。
モデルは現在、解決方法がわからないいくつかのパフォーマンスの問題を除いて、アプリケーションでかなりうまく機能しています。このアプリケーションの機能の1つは、最大数とランド数を設定することにより、フレーム要素のxmlノードを追加することです。各Frame要素には、それぞれ0からMaxNum-1および0からMaxRand-1までのNum番号とRand番号の両方があります。さらに、Rand=0番目とRand=MaxRand-1番目の要素にそれぞれ子パラメーター要素を追加する必要があります。簡略図は次のとおりです。
MaxNumとMaxRandの両方が小さい場合、つまりFrame要素の総数が約50の場合、アプリケーションは正常に機能します。ただし、要素数が500程度を超えると、QAbstractItemModel関数を介したFrame要素の追加が非常に遅くなります。GUIが長時間フリーズし、ほとんどの時間待つことを諦めました。
メジャーアップデート:
モデルに1000個のアイテムを大量に挿入すると、速度が低下する原因がわかりました。挿入されたアイテムごとに1回insertRow(row、parent)とsetData()の両方を呼び出していましたが、これらの関数内で発行されるシグナルのために非常にコストがかかることがわかりました。
代わりに、コードをinsertRows(row、1000、parent)に変更し、dataChanged(currIndex、currIndex)を発行しない新しいsilentSetData()を定義しました。また、notifyDataChanges(startRow、endRow、parentIndex)と呼ばれる新しいパブリック関数も含めました。この関数は、指定された範囲のデータに対してdataChangedシグナルを1回発行します。すべて問題ありませんが、データセット全体が挿入された後、呼び出し元クラスはnotifyDataChangesを明示的に呼び出す必要があります。
今、私はなぜdataChangedシグナルをそれほど高価なのか疑問に思っていますか?モデルに多数のアイテムを一度に挿入/変更するときに、この問題を解決するために他の手段を試した人はいますか?
c++ - QAbstractTableModelモデルをフィルタリングする方法
tableModelというQAbstractTableModelモデルとlistModelというQAbstractListModelモデルを作成し、これらのモデルをそれぞれのビュー(QTableViewとQListView)に設定しました。listModelに基づいてtableModelをフィルタリングします。つまり、誰かがリストアイテムをクリックすると、テーブルビューが表示されます。リスト項目に基づいてフィルタリングされます。これらのモデルは完全に機能しています。フィルタリングを行う方法を教えてください。
QSqlModelでは、SQL関係を持つsetFilterメンバーを使用してこれを行うことができます。
qt - Qt、QStandarItemModel: カスタム QComboBox のデリゲーション項目がモデルのインスタンス化子からコンテンツを埋めます
QComboBox
特定の列の各行にを表示するテーブルを Qt に実装する必要があります。
この質問に基づいて: QStandardItem + QComboBoxを作成することに成功しましたQItemDelegate
。その例では、QComboBox
コンテンツはクラスで静的に定義されComboBoxDelegate
ていますが、私の場合はQComboBox
、が作成される関数内でコンテンツを定義する必要がありますQStandardItemModel
。
モデルはMainWindow
クラス メソッド内で定義されます。
ComboBox
次に、デリゲート クラスからコンテンツを復元できるはずです。
プロジェクトは正常にコンパイルされますが、セルをクリックしてQComboBox
値を変更すると、プログラムがクラッシュし、「無効なパラメーターが C ランタイム関数に渡されました」というメッセージが表示されます。
qt - 複数の列の QTreeView/QAbstractItemModel サブツリー
QAbstractItemModel
にプラグインするサブクラスに取り組んでいQTreeView
ます。再帰Name = Value
型構造を持っています - どのインデックスも独自のサブツリーを持つことができます。ほとんどすべてのツリー ビューがそのように機能するため、これは左側で問題ありません。問題は、右側にのみサブツリー (値のリスト) が必要な場合があることです。私が今持っているように、それはうまくいくように思えますが、Qt はrowCount()
右側を呼び出すことはなく、そこにサブツリーが必要であることを認識していません。
私が現在持っている解決策は、基本的にそのための別のモデルを作成し、setIndexWidget
これが発生するたびに別のツリービューを提供するために使用することです. それは問題ありませんが、ツリービューをあちこちに配置することなく、サブツリーを右側に表示したいと本当に思っています。私のモデルはそこにサブツリーがあると応答しますが、Qt はそれらを要求することはありません。
これが少し不明確な場合、これは私が達成したいことの基本的な考え方です:
そのままでは、Qtがその列でorを呼び出すことはないため、複合値はそれらの隣に 's +
' と's' を取得しません。-
hasChildren()
rowCount()
サブツリー ビューを表示する必要がある場合は、それで問題ありません。最初にそれを行うより良い方法がないことを確認したいだけです。
c++ - QtQAbstractItemModel-アイテムの削除がクラッシュする
階層構造を持ち、ツリービューで表示する必要があるQtクラスを使用してアプリケーションを作成しています(QTreeViewウィジェットを使用しています)。データ自体は次のようになります。
QAbstractItemModelを実装するStatisticsModelというクラスがあります。これを使用して、StatisticsEntryツリーに格納されているデータを操作および表示します。このクラスには、StatisticsEntryレコードをモデルにプッシュするために使用するaddStatisticsDataというメソッドがあります。メソッドは大まかに次のようになります。
SetTitleメソッドとsetDescriptionメソッドは同じです-setTitleメソッドは次のとおりです。
setDataメソッドは次のとおりです。
残っているのはgetItemメソッドです。
新しいエントリの追加と既存のエントリの変更について話すときは、これですべてです。私のアプリケーションでは、QSortFilterProxyModelも実装しました。特別なことは何もありません。lessThanメソッドだけです。プロキシモデルを使用して、データを表示するQTreeViewの並べ替え機能を提供します。モデルをツリービューウィジェットに接続する次のコードがあります。
メインウィンドウのヘッダー:
メインの未亡人のコンストラクターで
アプリケーションには、選択したアイテムをモデルから削除できるボタンもあります。現在、QTreeView :: selectionModel()-> currentIndexでのみテストしており、当面は複数選択は行いません。
StatisticsModel::removeRowsメソッドの次のコードがあります
問題は、QAbstractItemModel :: removeRowメソッドを使用してアイテムを削除すると、例外が発生し、スタックトレースが次のようになる場合があることです。
奇妙なことに、これは、アイテムの削除に関するすべての即時メソッド呼び出しがすでに終了した後に発生するようです。プロキシモデルは、もう存在してはならないモデルインデックスを探しているようです(またはそう思います)。StatisticsModel::parentメソッドは次のとおりです。
例外が発生すると、上記のメソッドのchildItem変数とparentItem変数に関連付けられた値が無効に見えます。ポインタ自体がアクセスできないメモリを指しているか、メンバーのQListにエントリがないか、エントリによってメモリアクセス違反が発生します。親メソッドが正しくない可能性がありますが、親インデックスをフェッチする方法-qabstractItemModelドキュメントでは、そのメソッドでQModelIndex :: parentを使用しないと、無限再帰が作成されます。
どんな助けもいただければ幸いです、