문제

일부 셀에서 확인란이있는 QtableWidget이 있습니다.테이블에서 데이터를 사용하는 동안 일부 시간 동안 사용자가 마우스 클릭을 수행 할 수있는 사용자를 비활성화하고 싶습니다 (그래서 확인란 상태를 변경할 수 없으므로).table.setDisabled(1)를 시도했지만 전체 테이블을 비활성화하면 스크롤을 사용하도록 설정해야합니다.

도움이되는 모든 도움이 될 것입니다.

편집 더 정확하게 : 테이블에 최대 15x3000 셀이있을 수 있으며, 텍스트 (편집 가능), 확인란 (checkable), svg 그래픽으로 가득 찼을 수 있습니다 (다른 윈도우를 더블 클릭하면) 또는 일부 사용자 정의 위젯 (클릭 가능 또는 편집 가능부속).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)
.

업데이트 :

셀 위젯에 대한 일반 래퍼 클래스를 추가하여 위의 아이디어를 확장 할 수 있습니다.

아래의 클래스는 테이블 위젯 항목의 텍스트 및 체크 상태 및 이벤트 필터 (다른 이벤트는 필요에 따라 차단 될 수 있음).

셀 위젯은 다음과 같이 만들어야합니다.

    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를 반복하고 플래그 값 변경할 수없는 항목의 경우
깃발을 사용할 수 있습니다 : Qt::ItemIsEditable 또는 / 및 Qt::ItemIsEnabled.

비활성화를 원하지 않는 QCheckBox가있는 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)
.

여기에서 해당 설명서를 찾을 수 있습니다.

void qtableWidgetItem :: setFlags (qt :: itemflags 플래그)

항목의 플래그를 지정된 플래그로 설정합니다.이는 항목을 선택하거나 수정할 수 있는지 여부를 결정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top