QCheckBox

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.cb = QtGui.QCheckBox('&Show title', self)
        self.cb.move(20, 20)
        # 状態を3つに増やす
        self.cb.setTristate()
        #
        self.cb.stateChanged.connect(self.changeTitle)


        # Qt::CheckState列挙型に準拠
        names = ['Unchecked', 'PartiallyChecked', 'Checked']
        for i, v in enumerate(names):
            button = QtGui.QPushButton(v, self)
            button.move(120, 20 + 30 * i)
            button.clicked.connect(self.changeState)
            button.setWhatsThis( str( i ) )

        self.preSender = button # テンポラリオブジェクト
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('QtGui.QCheckBox')
        self.show()


    def changeTitle(self, state):

        self.sender().checkState() # 第二引数のstateと同値
        if state == QtCore.Qt.Checked:
            self.setWindowTitle('QtCore.Qt.Checked')
        elif state == QtCore.Qt.PartiallyChecked:
            self.setWindowTitle('QtCore.Qt.PartiallyChecked')
        elif state == QtCore.Qt.Unchecked:
            self.setWindowTitle('QtCore.Qt.Unchecked')

    def changeState(self):

        self.preSender.setEnabled(True)
        self.preSender = sender = self.sender()
        # 選択したものを無効にする
        sender.setEnabled(False)
        # ステートを設定
        self.cb.setCheckState( int( sender.whatsThis() ) )


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

whatsThisってメソッド名まんまで面白いですね。
idなど振りたいときはあと、QObject::setObjectNameなど文字列で判別名与える感じなんでしょうか。