Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QTabWidget with CheckBox in title

I was wondering how to create (using PyQt4) a derived QTabWidget with a check box next to each tab title? Like this:

like image 204
Jib Avatar asked Dec 22 '22 14:12

Jib


1 Answers

Actually I chose to only subclass QTabWidget.
The checkBox is added at the creation of a new tab and saved to a list in order to get its index back.
setCheckState/isChecked methods are intended to control the state of each checkBox specified by its tab index.
Finally, the "stateChanged(int)" signal is captured and remitted with an extra parameter specifying the index of the checkBox concerned.

class CheckableTabWidget(QtGui.QTabWidget):

    checkBoxList = []

    def addTab(self, widget, title):
        QtGui.QTabWidget.addTab(self, widget, title)
        checkBox = QtGui.QCheckBox()
        self.checkBoxList.append(checkBox)
        self.tabBar().setTabButton(self.tabBar().count()-1, QtGui.QTabBar.LeftSide, checkBox)
        self.connect(checkBox, QtCore.SIGNAL('stateChanged(int)'), lambda checkState: self.__emitStateChanged(checkBox, checkState))

    def isChecked(self, index):
        return self.tabBar().tabButton(index, QtGui.QTabBar.LeftSide).checkState() != QtCore.Qt.Unchecked

    def setCheckState(self, index, checkState):
        self.tabBar().tabButton(index, QtGui.QTabBar.LeftSide).setCheckState(checkState)

    def __emitStateChanged(self, checkBox, checkState):
        index = self.checkBoxList.index(checkBox)
        self.emit(QtCore.SIGNAL('stateChanged(int, int)'), index, checkState)

This is maybe not the perfect way to do things, but at least it remains pretty simple and covers all my needs.

like image 64
Jib Avatar answered Dec 28 '22 09:12

Jib