2016-03-24 6 views
-2

私はQTableWidgetを持っていて、すでに選択されているものに応じて項目を選択できるようにしたい(2番目の列に同じ内容がある場合のみ)。QTableWidgetで特定の項目を複数選択できるようにするにはどうすればいいですか?

アイテムを選択可能にするかどうかを知っています。しかし、すべてのものが選択可能なままでなければならないので、ユーザは単一のアイテムを選択して新鮮な選択を開始することができます。 ShiftキーまたはCtrlキーを押しながら選択項目に追加するだけで、適切な項目のみを許可または選択する必要があります。

選択に追加するのに適切な行のみを受け入れることができますか?

注:私はPySideを使用していますが、C++またはPyQtコードからうまく動作します。

+0

QItemSelectionModel – Fabio

+0

をサブクラス化することはできますか?選択をオーバーロードすると半分になるかもしれませんが、シフトがCtrlキーで押されているときにマウスが上に移動すると、アイテムが選択可能に表示されたほうが理想的です。 cttrl/shiftが押されるたびにItemIsSelectableフラグを変更することは悪いようです。 –

+1

「マウスの上にマウスを置くとアイテムが選択可能に表示されます」とはどういう意味ですか?選択可能な項目とマウスの上にマウスを置いたときに選択可能な項目との間に相違があるようには思われません。私はあなたが 'QItemSelectionModel'の2つの' select'メソッドをオーバーロードして、既に選択されているアイテムに応じてアイテムを選択することができると思います。(確かではありませんが、私はこのようなことは一度もしませんでした) – Fabio

答えて

-1

QTableWidget.itemSelectionChanged信号に接続して、選択範囲に基づいてテーブル内の他のすべての項目のQt.ItemIsSelectableフラグを変更できます。

from itertools import product 

table = QtGui.QTableWidget() 
table.itemSelectionChanged.connect(self.on_itemSelectionChanged) 

@QtCore.pyqtSlot() 
def on_itemSelectionChanged(self): 
    sel_items = self.table.selectedItems() 

    # get all items in table 
    items = [] 
    for r, c in product(range(self.table.rowCount()), range(self.table.columnCount())): 
     items.append(self.table.item(r, c) 

    # Loop through all the items in the table and 
    # set the selection flag based of already selected items. 
    for item in items: 
     if can_be_selected: 
      item.setFlags(item.flags() | QtCore.Qt.ItemIsSelectable) 
     else: 
      item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable) 
+0

次に、現在の選択を置き換えるために、新しい項目を(シフトまたはCtrlキーを使用せずに)選択することはできません。 「can_be_selected」は、現在の選択が置き換えられるかまたは拡張される天気に依存する。 –

+0

新しい選択を行う前に、現在の選択を解除するだけです。 –

関連する問題