Come faccio ad avere un po 'di slot / funzione da eseguire quando una certa QTableWidgetItem viene controllato / non controllato in PyQt

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

Domanda

Ho una tabella creata dinamicamente, che ha N righe e M QTableWidgetItems (che vengono utilizzati solo come caselle) per riga - I necessario eseguire il codice che conosce la riga e la colonna ogni volta che una casella è selezionata o deselezionata

Il mio CheckBox sottoclasse appare come:

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

Ovviamente questo non ridefinisce la funzione che viene chiamata quando SIGNAL('stateChanged(int)') -thingy accade, perché, bene, non succede nulla.

Ma, se faccio:

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

Nel ciclo creazione della tabella, ottengo un errore:

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

Modifica : Ho provato anche la ridefinizione setCheckState() ma a quanto pare questo non non richiamate quando la voce è selezionata o deselezionata.

Modifica 2 : Inoltre, cambiando la connessione a

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

dove table = QTableWidget() non aiuta neanche.

Come faccio a fare questo il modo giusto?

È stato utile?

Soluzione

La soluzione più semplice è probabilmente il collegamento al segnale cellChanged(int, int) del QTableWidget; dare un'occhiata al seguente esempio:

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_()

Si crea una tabella 5x5 di caselle di controllo; quando è selezionata una di esse / incontrollato, myCellChanged è chiamato e stampa riga e della colonna della casella di controllo modificato; si può quindi di utilizzo naturalmente QTableWidget.item(someRow, someColumn).checkState() per vedere se è stato controllato o incontrollato.

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