¿Cómo consigo un poco de ranura / función a ejecutar cuando un cierto QTableWidgetItem se comprueba / sin comprobar en PyQt

StackOverflow https://stackoverflow.com/questions/3829349

Pregunta

I tiene una tabla creada dinámicamente, que tiene N filas y M QTableWidgetItems (que sólo se utilizan como casillas de verificación) por fila - I tenga que ejecutar código que conoce la fila y la columna siempre que una casilla de verificación está activada o desactivada

Mi CheckBox subclase se ve así:

class CheckBox(QTableWidgetItem):
    def __init__(self):
        QTableWidgetItem.__init__(self,1000)
        self.setTextAlignment(Qt.AlignVCenter | Qt.AlignJustify)
        self.setFlags(Qt.ItemFlags(
            Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled ))
def stateChanged(self):
    do_something(self.row(),self.column())
    ...

Obviamente, esto no redefine la función que se llama cuando -thingy SIGNAL('stateChanged(int)') sucede, porque, bueno, no pasa nada.

Pero, si lo hago:

item = CheckBox()
self.connect(item, SIGNAL('stateChanged(int)'), item.stateChanged)

En el bucle de la creación de la mesa, me sale un error:

TypeError: arguments did not match any overloaded call:
  QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 1 has unexpected type 'CheckBox'
  QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 1 has unexpected type 'CheckBox'
  QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 1 has unexpected type 'CheckBox

Editar : También probé la redefinición setCheckState() pero al parecer que lo hace no te llaman cuando el artículo está marcado o no.

EDIT 2 : Además, el cambio de la conexión a

self.connect(self.table, SIGNAL('itemClicked(item)'),
               self.table.stateChanged)

donde table = QTableWidget() no ayuda tampoco.

¿Cómo hacer esto de la manera correcta?

¿Fue útil?

Solución

La solución más sencilla es probablemente la conexión a la señal cellChanged(int, int) del QTableWidget; echar un vistazo al siguiente ejemplo:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

#signal handler
def myCellChanged(row, col):
    print row, col

#just a helper function to setup the table
def createCheckItem(table, row, col):
    check = QTableWidgetItem("Test")
    check.setCheckState(Qt.Checked)
    table.setItem(row,col,check)

app = QApplication(sys.argv)

#create the 5x5 table...
table = QTableWidget(5,5)
map(lambda (row,col): createCheckItem(table, row, col),
   [(row, col) for row in range(0, 5) for col in range(0, 5)])
table.show()

#...and connect our signal handler to the cellChanged(int, int) signal
QObject.connect(table, SIGNAL("cellChanged(int, int)"), myCellChanged)
app.exec_()

Se crea una tabla de 5x5 de casillas de verificación; siempre que uno de ellos se comprueba / sin control, myCellChanged se llama e imprime la fila y columna de la casilla de verificación cambiada; se puede entonces, por supuesto uso QTableWidget.item(someRow, someColumn).checkState() para ver si se ha marcado o no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top