Wie erhalte ich eine Schlitz / Funktion ausgeführt werden, wenn eine bestimmte QTableWidgetItem geprüft / nicht markiert in PyQt

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

Frage

Ich habe eine dynamisch erstellte Tabelle, die N Reihen und M QTableWidgetItems hat (die nur als Kontrollkästchen verwendet werden) pro Zeile - Ich brauche Code auszuführen, der die Zeile und Spalte weiß, wenn ein Kontrollkästchen aktiviert ist oder nicht markiert

Meine CheckBox Unterklasse sieht aus wie:

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

Offensichtlich ist dies die Funktion nicht neu definieren, die aufgerufen wird, wenn SIGNAL('stateChanged(int)') -thingy geschieht, weil, na ja, passiert nichts.

Aber, wenn ich tun:

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

In der Schleife Erstellen der Tabelle, ich erhalte eine Fehlermeldung:

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

Bearbeiten : Ich habe auch versucht setCheckState() neu zu definieren, aber anscheinend das tut nicht aufgerufen werden, wenn die Option aktiviert ist oder nicht aktiviert.

EDIT 2 : Darüber hinaus ändert die connect to

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

Dabei gilt table = QTableWidget() entweder nicht hilft.

Wie kann ich das tun, den richtigen Weg?

War es hilfreich?

Lösung

Die einfachste Lösung ist wahrscheinlich auf das cellChanged(int, int) Signal des QTableWidget verbindet; werfen Sie einen Blick auf das folgende Beispiel:

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

Es schafft eine 5x5 Tabelle von Kontrollkästchen; immer dann, wenn einer von ihnen wird aktiviert / deaktiviert, myCellChanged aufgerufen und druckt die Zeile und Spalte des geänderten Kontrollkästchen; Sie können dann natürlich Verwendung QTableWidget.item(someRow, someColumn).checkState() zu sehen, ob es aktiviert oder deaktiviert wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top