PyQtで特定のQTableWidgetItemがチェックされている/チェックされていないときに実行されるスロット/関数を取得するにはどうすればよいですか

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

質問

動的に作成されたテーブルがあり、行ごとに 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() どちらも役に立ちません。

これを正しい方法で行うにはどうすればよいですか?

役に立ちましたか?

解決

最も簡単な解決策はおそらく、 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() チェックが入っているかどうかを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top