Domanda

Ho QtableWidget con caselle di controllo in alcune celle.Voglio disabilitare l'utente per eseguire il clic del mouse sopra le celle della tabella (quindi non può cambiare lo stato della casella di controllo) per qualche tempo mentre sto usando i dati dalla tabella.Ho provato table.setDisabled(1) ma che disabilita la tabella intera e ho bisogno di scorrere per essere abilitato.

Qualsiasi aiuto sarebbe apprezzato.

Modifica Per essere più precisi: potrebbero esserci fino a 15x3000 celle in tabella, riempite con testo (modificabile), casella di controllo (checkable), grafica svg (apre un'altra finestra quando si fa doppio clic su di esso) o alcuni widget personalizzati (che hanno anche clicabili o modificabiliparti).Ho bisogno di disabilitare l'utente per fare clic o fare doppio clic su celle (quindi non può cambiarli) per 1sec - 10sec intervallo di tempo (la soluzione deve essere qualcosa di veloce, non intestando attraverso tutti gli articoli), ma ho bisogno della barra di scorrimento aessere abilitato e normale visibilità della tabella.

È stato utile?

Soluzione

Un modo per raggiungere questo obiettivo è di sottoclasse qtablewidgetItem e ri-implementare il setData metodo. In questo modo, è possibile controllare se gli articoli accettano valori per determinati ruoli.

Per controllare la "verificabilità" per tutti gli elementi, è possibile aggiungere un attributo di classe alla sottoclasse che potrebbe essere testata ogni volta che un valore per il ruolo dello stato di controllo è stato passato a SetData.

Ecco cosa potrebbe sembrare la sottoclasse:

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)
.

E la "verificabilità" di tutti gli articoli sarebbe disabilitata come questa:

    TableWidgetItem.setCheckable(False)
.

Aggiornamento :

L'idea di cui sopra può essere estesa aggiungendo una classe wrapper generica per i widget delle celle.

Le classi di seguito bloccheranno le modifiche al testo e allo stato di controllo per gli elementi del widget da tavolo e anche una gamma di eventi tastiera e mouse per i widget cellulari tramite un Filtro evento (altri eventi possono essere bloccati come richiesto).

I widget cell dovrebbero essere creati come questo:

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

e poi accessibile come questo:

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

Il blocco per l'intera tabella sarebbe commutata in questo modo:

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

Ecco le classi:

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)
.

Altri suggerimenti

basta scorrere attraverso tutti i QStandardItems e modificare Valori flags per articoli che non dovrebbero essere modificabili.
È possibile utilizzare la bandiera: Qt::ItemIsEditable o / e Qt::ItemIsEnabled.

Avresti bisogno di disabilitare gli oggetti stessi al contrario di tutto il tavolo se hai altri oggetti rispetto a qCheckboxes che non vorresti disabilitare.Vedi il codice Python qui sotto per i dettagli:

'''
    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)
.

Qui puoi trovare la documentazione corrispondente:

.

Void qtablewidgetItem :: setflags (qt :: flags flags)

Imposta le bandiere per l'oggetto ai flag dati.Questi determinano se l'elemento può essere selezionato o modificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top