問題タブ [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 - QTreeWidgetItem のロールとは何ですか?
いくつQTreeWidget
かの列があり、それに追加QTreeWidgetItems
します。2番目の列にそれぞれの数値Item
を含めて、この値でアイテムをソートできるようにします
role
この引数が何であるかに関するドキュメントが見つかりません。私が知っているのは、1または2に設定すると列に何かが表示され、0または> = 3に設定すると列に何も表示されず、数値は常にアルファベット順にソートされるということです.これは間違っています。
qt - QObject::connect QAbstractItemModel の問題
list->model(); で QAbstractItemModel を取得する QListView があります。
この後、dataChanged シグナルを私のカスタム QObject に接続したいと思います。
ここに私のカスタムオブジェクトがあります:
私は何か間違ったことをしていますか?QObject 呼び出しは true を返します。onText 関数に cout がありますが、QListView が変更されたときに何も出力されません。
qt - QtのrowInsertedシグナルの後に挿入されたデータを取得するのに役立ちます
QAbstractItemModelのrowsInsertedSIGNALに接続するonTextメソッドがあるので、新しい行が挿入されたときに通知を受け取ることができます。
行が挿入されると通知されるので、信号は正常に機能します。onTextメソッドは次のとおりです。
しかし、挿入されたアイテムから文字列を取得できないようです。渡されたQModelIndex「親」は無効であり、「m」QAbstractItemModelはNULLです。それは実際のアイテムではなく、単なるポインタだからだと思いますか?挿入されたテキスト/要素を取得するにはどうすればよいですか?
qt - QAbstractItemModel のルート項目を宣言できますか?
アイテム ビューの親モデル インデックスを設定する可能性があることは知っていますが、モデルに対してこれを行いたいと思います。
理由は非常に単純です。これらの構造を取り除きたいのです。
c++ - QAbstractItemModel (C++) による複数の追加/削除 (および元に戻す/やり直し) のサポート
ご挨拶、
モデルからのオブジェクトの任意のセットの削除の取り消し/やり直しをサポートするために、厄介なコードを書いています。他のすべてのミューテーター (追加/コピー/貼り付け) はこの機能のサブセットであるため、これについては正しく行っているように感じます。
コードは私にとって必要以上に厄介です。主に、モデルを変更する唯一の方法は、beginInsertRows/beginRemoveRows を呼び出して範囲内の行を削除することです (一度に 1 行ずつ実行するだけで、「隣人」を単一に最適化する必要はありません)。まだ電話する)
beginInsertRows/beginRemoveRows の問題は、行の削除が別の QModelIndex (たとえば、リストにキャッシュされたもの) に影響を与える可能性があることです。例えば:
ChildObj1 と ChildObj3 を選択して削除するとします。最初に ChildObj1 を削除すると、ChildObj3 の QModelIndex が変更されます (行が異なります)。親オブジェクトを削除すると、同様の問題が発生します (ただし、オブジェクトのリストから子を「プルーニング」することでこれを修正しました)。
このインターフェイスの制限を回避するために私が考えた方法は次のとおりですが、先に進む前に、より良い方法を求めることにしました。
提供された QModelIndices のリストが上から下に並べられていると仮定して、「後方」に移動します。これには、ソートが信頼できるものであることが本当に必要であり、ソートはおそらく素朴で遅いものになるでしょう (QModelIndexes のコレクションをソートするスマートな方法があるかもしれませんか? または、QItemSelectionModel は適切な (順序付けられた) リストを提供しますか?)
オブジェクトが削除/追加されるたびに他の QModelIndeces を更新します (非単純な解決策を考えることはできません。リストを検索し、必要に応じて新しい QModelIndeces を取得してください)。
実際のデータの更新は簡単なので、データを更新してモデルを再構築するだけです。これはグロテスクに思えますが、大規模なデータ セットでは非常に遅くなることは想像に難くありません。
それらは私が現在持っているアイデアです。現在、オプション 1 に取り組んでいます。
よろしく、 ダン・オー
qt4 - ディレクトリのようなツリー構造を格納および編集 (GUI) するための最もエレガントで安全で簡単なソリューションは?
少し難しい問題があります。これを想像してください:
私のアプリケーションの 1 つはスクリプトを多用する必要があるため、ユーザーがスクリプト スニペットを記述し、それらをディレクトリのようなツリー構造に編成する方法を提供することを考えました。これは、サブディレクトリとソース ファイルを含むソース コード ディレクトリによく似ています。
データクラス/保存
最初に遭遇する問題は、ツリー構造全体を (ディスク上および実行時にアプリケーション内に) 格納するための適切な方法を見つける必要があるということです。このために、私はこれらのアイデアを持っていました:
- QObject の親子機能を使用してツリーを表すことができる QObject 派生クラスを使用します。このようにして、親が削除された場合にそれらのオブジェクトを削除することを心配する必要はありません。
- 子の QList (ポインターなし) と、各グループ/スクリプトのプロパティを格納するいくつかのプロパティを含む単純なクラスを使用します。
- アプローチ#2を使用しますが、静的オブジェクトの代わりにポインターを使用します-これにより、グループまたはツリーの一部を関数などに渡す必要がある場合に無駄なコピーを回避できます.
- SQLite (または同様の) データベースへのライブ バックエンドを使用し、実行時にクエリを実行します。これにより、ツリー全体を一度にロードして RAM に保持することを回避できます。
- ファイル システムでフラットなファイルとディレクトリ構造を使用します。ただし、オブジェクトに関するメタ情報を保存する方法がないため、必要以上に問題が発生すると思います。
編集者
次に遭遇する問題は、ユーザーがおそらくツリー構造全体を編集したいという事実です。彼は、グループまたはスクリプトをクリックして、スクリプト コードを編集し、場合によってはディレクトリとスクリプトをツリー内でドラッグ アンド ドロップしたいと考えています。したがって、途中でツリー全体の構造を変更します。
これにより、次の問題が発生します。
- ユーザーがエディターを閉じた場合は、「変更を保存しますか?」という質問をユーザーに提供することをお勧めします。ダイアログ。誤って既存のドキュメントに何かを入力したテキスト エディターによく似ていますが、変更を保存せずに終了します。- これには、ツリー全体のコピーを編集し、必要に応じてアプリケーション内の既存のツリーを上書きする必要があります。
- ドラッグ&ドロップを許可すると問題が発生する可能性があります...
- ...保存方法 #1 : 現在、QObjects の子の順序を変更する良い方法はありません。また、プログラムの他の部分がオブジェクトにアクセスする可能性があるときに、実行時にオブジェクトを移動することはお勧めできません。
- ...これは、アプローチ #2 を格納する方が簡単です。ツリー全体が単一の値のように処理され、移動して再親化する必要がある子がないためです。ツリーの一部をコピーすると、すべての子などが自動的にコピーされます。残念ながら、これは多くのオーバーヘッドと柔軟性の損失を意味します (何が正確に変更されたかわからないため、ツリー全体をディスクに再度書き込む必要があります)。
もっと多くのことが頭に浮かんだら、おそらくこの質問を少し更新しますが、他の人がこの問題をどのように解決するのか本当に興味があります. 任意の提案やアイデアをいただければ幸いです。:)
c++ - QTreeViewのQAbstractItemModelで人工ノードを作成する方法
私の質問はQtとそのQAbstractItemModelについてです。
std::map<stringclass, double>
Qtウィジェットに表示したい文字列とdouble()のマップがあります。そのためにQTableViewを使用することもできますが、マップのキーが「 」で始まる複数の文字列、さらにabc.def.ghi
は「」で始まる複数の文字列が存在する可能性があるという事実を利用したいと思います。abc.def
abc
そこで、 QTreeViewでアイテムを表示するようにツリーデータモデルを設定したいと思います。
私の鍵はstd::map
ツリーの葉です。他のすべてのノードは、ユーザーの便宜のために折り畳みをサポートするための一時的で補助的な構造になります。
残念ながら、メソッド、、、rowCount
およびにはconst-modifiersがあるため、QAbstractItemModel派生内のヘッダーの補助データ構造を単純に設定して、そのデータ構造を変更することはできません。index
columnCount
data
そのためのベストプラクティスは何でしょうか?自分std::map
とQAbstractItemModelの間に別のクラスレイヤーを設定する必要がありますか、それともこれを行うためのよりスマートな方法がありますか?
編集1:QTreeViewが表示および使用されているstd::map
間に変更される可能性があるため、補助ノードが破棄されて再構築される可能性があります。私の仮定は、これを処理する最良の方法はQAbstractItemModelを再構築することです-または、単にそのモデルを破棄して、新しく構築されたモデルをQTreeViewに割り当てる必要がありますか?その場合、メソッドの定数に煩わされることなく、コンストラクター内のすべてのノードをセットアップできたと思います。
python - PyQt4 の QVariant から Python オブジェクトを取得するにはどうすればよいですか?
QAbstractItemModel
に表示されるのサブクラスを作成していQTreeView
ます。
My index()
and function は、継承された関数を使用して をparent()
作成し、必要な、、および を提供します。ここでは、テスト目的で、data は Python 文字列です。QModelIndex
QAbstractItemModel
createIndex
row
column
data
index()
、parent()
、および関数内でdata()
、データを取り戻す必要があります。として提供されますQVariant
。QVariant から Python オブジェクトを取得するにはどうすればよいですか?
c++ - QTableViewソート信号?
QTableView
+を使用QStandardItemModel
していくつかのデータ(他のデータ構造に格納されているデータ)を表示します。このテーブルビューは並べ替え可能です。
並べ替えが可能なので、このモデルを並べ替えるときは、保存されているデータの順序も並べ替える必要があります。ソート信号用のスロットを実装しようとしましたが、ヘッダーをクリックしてソートアクションを開始したときにどの信号が出力されるかわかりません。
クリックされたシグナルを試しましたが、headerDataではなく、データ行に対してのみ発行されます。QtableView
+の並べ替え中に何か他のことをしたい場合はどうすればよいですQStandardItemModel
か?