質問

いくつかのセルでチェックボックスを持つQtableWidgetを持っています。テーブルからデータを使用している間は、テーブルセルを越えてマウスクリックを実行するためにユーザーを無効にします(そのため、チェックボックスの状態を変更できません)。table.setDisabled(1)を試しましたが、テーブル全体を無効にして、スクロールする必要があります。

任意の助けが理解されるでしょう。

編集 より正確に:テキスト(編集可能)、チェックボックス(Checkable)、SVGグラフィック(ダブルクリック時に他のウィンドウを開く)またはカスタムウィジェット(クリック可能または編集可能)で埋められたテーブルには最大15 x 3000セルがあります。部品)。ユーザーを無効にする必要があります(Solutionのいずれかを変更できません)、1Sec - 10sec時間間隔(ソリューションを繰り返し、すべてのアイテムを繰り返すことはできません)が必要ですが、スクロールバーが必要です。有効と通常のテーブルの可視性があります。

役に立ちましたか?

解決

これを達成する1つの方法は、QtableWidgetItemをサブクラス化し、を再実装することです。 setData メソッドそのように、特定の役割の値を受け入れるかどうかを制御できます。

すべての項目の「チェック可能性」を制御するには、チェックステートロールの値がsetDataに渡されたときにテストできるサブクラスにクラス属性を追加することができます。

これはサブクラスが次のようになるかもしれないものです:

class TableWidgetItem(QtGui.QTableWidgetItem):
    _blocked = True

    @classmethod
    def blocked(cls):
        return cls._checkable

    @classmethod
    def setBlocked(cls, checkable):
        cls._checkable = bool(checkable)

    def setData(self, role, value):
        if role != QtCore.Qt.CheckStateRole or self.checkable():
            QtGui.QTableWidgetItem.setData(self, role, value)
.

とすべてのアイテムの「チェック可能性」はこのように無効にされます。

    TableWidgetItem.setCheckable(False)
.

更新

セルウィジェットの一般的なラッパークラスを追加することで上記のアイデアを拡張できます。

以下のクラスは、テーブルウィジェットアイテムのテキストとチェック状態、および event-filter (他のイベントは必要に応じてブロックすることができます)。

セルウィジェットをこのように作成する必要があります。

    widget = CellWidget(self.table, QtGui.QLineEdit())
    self.table.setCellWidget(row, column, widget)
.

から次のようにアクセスします。

    widget = self.table.cellWidget().widget()
.

テーブル全体のブロックは次のように切り替えられます。

    TableWidgetItem.setBlocked(True)
    CellWidget.setBlocked(True)
    # or Blockable.setBlocked(True)
.

ここにクラスがあります:

class Blockable(object):
    _blocked = False

    @classmethod
    def blocked(cls):
        return cls._blocked

    @classmethod
    def setBlocked(cls, blocked):
        cls._blocked = bool(blocked)

class TableWidgetItem(Blockable, QtGui.QTableWidgetItem):
    def setData(self, role, value):
        if (not self.blocked() or (
            role != QtCore.Qt.EditRole and
            role != QtCore.Qt.CheckStateRole)):
            QtGui.QTableWidgetItem.setData(self, role, value)

class CellWidget(Blockable, QtGui.QWidget):
    def __init__(self, parent, widget):
        QtGui.QWidget.__init__(self, parent)
        self._widget = widget
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(widget)
        widget.setParent(self)
        widget.installEventFilter(self)
        if hasattr(widget, 'viewport'):
            widget.viewport().installEventFilter(self)
        widget.show()

    def widget(self):
        return self._widget

    def eventFilter(self, widget, event):
        if self.blocked():
            etype = event.type()
            if (etype == QtCore.QEvent.KeyPress or
                etype == QtCore.QEvent.KeyRelease or
                etype == QtCore.QEvent.MouseButtonPress or
                etype == QtCore.QEvent.MouseButtonRelease or
                etype == QtCore.QEvent.MouseButtonDblClick or
                etype == QtCore.QEvent.ContextMenu or
                etype == QtCore.QEvent.Wheel):
                return True
        return QtGui.QWidget.eventFilter(self, widget, event)
.

他のヒント

一般のQStandardItemsを繰り返し、フラグ値変更可能ではないアイテムの場合は
Flag:Qt::ItemIsEditableまたは/およびQt::ItemIsEnabledを使用できます。

無効にしたいというQCheckBoxよりも他の項目がある場合は、テーブル全体とは対照的に、アイテム自体を無効にする必要があります。詳細については、以下のPythonコードを参照してください。

'''
    Iterate through all the check boxes in the standard items
    and make sure the enabled flag is cleared so that the items are disabled
'''
for standardItem in standardItems:
    standardItem.setFlags(standardItem.flags() & ~Qt.ItemIsEnabled)
.

ここに対応する文書を見つけることができます:

href="http://qt-project.org/doc/qt-5/qtablewidgetItem.html#setflags" rel="nofollow"> void QtableWidgetItem :: SetFlags(Qt :: ItemFlagsフラグ)

項目のフラグを指定されたフラグに設定します。これらは、項目を選択または変更できるかどうかを判断します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top