1

我有一个动态创建的表,其中每个行有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)')-thingy 发生时调用的函数,因为,好吧,什么都没有发生。

但是,如果我这样做:

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)

wheretable = QTableWidget()也无济于事。

我该如何以正确的方式做到这一点?

4

1 回答 1

2

最简单的解决方案可能是连接到 ; 的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()它来查看它是选中还是未选中。

于 2010-09-30T13:03:05.870 回答