Как мне заставить некоторый слот / функцию выполняться, когда определенный Python / QTableWidgetItem отмечен / не отмечен - PullRequest
1 голос
/ 30 сентября 2010

У меня есть динамически создаваемая таблица с N строками и M QTableWidgetItems (которые используются только как флажки) для каждой строки - мне нужно запускать код, который знает строку и столбец всякий раз, когда флажок установлен или снят.

Мой подкласс CheckBox выглядит следующим образом:

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

Очевидно, что это не переопределяет функцию, которая вызывается, когда SIGNAL('stateChanged(int)') происходит, потому что, ну, ничего не происходит.

Но, если я сделаю:

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

В цикле создания таблицы я получу ошибку:

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

РЕДАКТИРОВАТЬ : я также попытался переопределить setCheckState() но очевидно, что НЕ вызывается, когда элемент отмечен или не отмечен.

РЕДАКТИРОВАТЬ 2 : Кроме того, изменив соединение на

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

, где table = QTableWidget() тоже не помогает.

Как мне сделать это правильно?

1 Ответ

2 голосов
/ 30 сентября 2010

Самое простое решение - это подключение к cellChanged(int, int) сигналу QTableWidget;взгляните на следующий пример:

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

Создает таблицу флажков 5x5;всякий раз, когда один из них отмечен / снят, вызывается myCellChanged и печатается строка и столбец измененного флажка;тогда вы, конечно, можете использовать QTableWidget.item(someRow, someColumn).checkState(), чтобы увидеть, был ли он отмечен или не отмечен.

...