Comment puis-je obtenir une fente / fonction à exécuter lorsqu'une certaine QTableWidgetItem est cochée / décochée dans PyQt

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

Question

I ont une table créée dynamiquement, qui présente N lignes et M QTableWidgetItems (qui ne sont utilisés que des cases à cocher) par rangée - je besoin pour exécuter le code qui connaît la rangée et de la colonne à chaque fois qu'une case est cochée ou désactivé

Les regards de mon CheckBox comme:

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

Il est évident que cela ne redéfinit pas la fonction qui est appelée quand SIGNAL('stateChanged(int)') -thingy arrive, parce que, eh bien, rien ne se passe.

Mais, si je fais:

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

Dans la boucle création de la table, je reçois une erreur:

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

EDIT : J'ai aussi essayé de redéfinir setCheckState() mais apparemment cela ne pas get appelé lorsque l'élément est cochée ou décochée.

EDIT 2 : De plus, le changement de se connecter à

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

table = QTableWidget() ne soit aide.

Comment puis-je faire de la bonne façon?

Était-ce utile?

La solution

La solution la plus simple est probablement relier au signal de cellChanged(int, int) du QTableWidget; jetez un oeil à l'exemple suivant:

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

Il crée une table 5x5 de cases à cocher; chaque fois que l'un d'entre eux est cochée / décochée, myCellChanged est appelée et imprime la ligne et la colonne de la case modifiée; vous pouvez alors l'utilisation des cours QTableWidget.item(someRow, someColumn).checkState() pour voir si elle a été cochée ou décochée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top