2

私は (PyQt4 を使用して) 小さな qt アプリを作成しており、アイデアを思いつきましたが、それを実装する方法がわかりません。一部のデータを表す QTableView があり、モデルの一部に接続できるチェックボックス コントロールを含む別の列を QTableView に追加したいと考えています。たとえば、次のようなものです。

代替テキスト

[削除] 列には、各行のチェックボックス ウィジェットがあることに注意してください (これは Web アプリであり、デスクトップ Qt アプリではありませんが、プリンシパルは同じです)。複数の行を選択して右クリックし、[選択項目のチェック/チェック解除] を選択できる場合のボーナス ポイント。

不明な点がある場合は、ここにコメントを残してください。明確にします。

4

3 に答える 3

8

独自のテーブル モデルを実装するのは (@Andy が推奨するように) 使用するよりもQStandardItemModel手間がかかりますが、やりたいことを細かく制御できるので、何をすべきかの概要を説明します。Qt のドキュメントPyQt のクラス ドキュメントについてすべて知っていて、必要なクラスを調べることができると仮定します。(すでにある場合は説明しすぎるかもしれませんが、QTableView何かを除外するよりはましだと思います。)

チェック可能な状態を取得するには:

  • のサブクラスを作成しますQTableModel
    • 行の内容を格納するデータ構造を選択します。これは非常に単純 (大きな内部リスト) の場合もあれば、SQL データベースと同じくらい複雑な場合もあります (その場合は、QSqlTableModel代わりに参照してください)。
    • rowCount、、、および をcolumnCountオーバーライドします。 datasetData
      • rowCountcolumnCountデータモデルに使用するものにかなり直接対応します。基本的に2D配列(またはリストのリスト)を使用している場合、それらはワンライナーと同じくらい短くすることができます.
      • data物事が面白くなるところです。アイテム モデルはいくつかの異なるフィールド (Qt はrolesを呼び出します) を格納し、何をdata返すかは、要求されているロールによって異なります。返されるもののデータ型について話しますが、常にラップする必要があることに注意してくださいQVariant
        • Qt.DisplayRoleテーブルのセルに表示されるテキストです。これは実際のデータであり、一般的なケースです (したがって、これがデフォルトの役割です)。
        • Qt.CheckStateRoleブール値です。戻るQt.Checkedと、チェックされたチェックボックスが表示され、チェックされていないチェックボックスQt.Uncheckedが返されます。列に含めたいのがチェックボックスだけの場合、この役割のみを処理します。
        • 他の役割は、アイコン、背景色、およびこれら以外の多くの機能に役立ちます。
        • 未処理のロールはQVariant.
      • setDataと対称dataです。で処理するロールを処理する必要がありdataます。Qt.DisplayRole実際のデータとQt.CheckStateRoleチェックボックスに対して。

行と列とセルを複数選択できるようにします。そのためには、選択モデルを理解する必要があります。短いバージョンは次のとおりです。

  • テーブル ビューで選択モードを設定します: view.setSelectionMode( QAbstractItemView.ContiguousSelection)。これにより、隣接するセルを強調表示できます。任意のセルを強調表示することもできます: を参照してくださいQAbstractView.SelectionMode
  • アクションの後に実際に選択されているセルを特定するには、テーブル ビューにその選択モデルを尋ねます ( 「l」に注意してください) view.selectionModel().selectedIndexes()。これらをforループで繰り返すことができます。

右クリックを許可するには:

  • ビューのcontextMenuEvent.
  • を作成し、QMenu必要なスロットに接続します。

より深い理解のために、モデル/ビューの Qt ガイドをまだ読んでいない場合は読んでください。そして、間違いなくQt item view examplesを見てください。記述されているものの多くは、はるかに少ないコード (2 つの @Jesse の言及を含む) で PyQt に実装されており、ツリー モデルの例はテーブルに引き継がれますが、作業ははるかに少なくなります (上記のように、実装する必要があるものははるかに少なくなります)。

于 2009-11-17T01:57:24.740 に答える
4

QStandardItemModel を見ることもできます。これは、「チェック可能な」状態を介してアイテムとやり取りするためのインターフェイスを提供します!

QAbstractItemModel から継承し、ロール Qt::CheckStateRole を使用することもできます...

于 2009-11-16T21:25:52.373 に答える
1

Qt/C++ では、列内のカスタム アイテムのデリゲートを作成できます。PyQtで非常によく似たことができると思います。次の例を参照してください。

スター デリゲートの例
スピン ボックス デリゲートの例

于 2009-11-16T19:47:47.533 に答える