QTabWidget with CheckBox in title

孤街醉人 提交于 2019-12-05 16:49:50
Jib

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.

The best approach would be to

  • Create a custom TabBar, CheckedTabBar (inheriting QTabBar)
  • Create a custom TabWidget, CheckedTabWidget (inheriting QTabWidget)
  • Add a way to test if a tab is checked or not, and maybe some signals when the checkbox is toggled :)

You should set your custom tabbar in the checkedtabwidget constructor, like this:

CheckedTabWidget::CheckedTabWidget(QWidget* parent) : QTabWidget(parent)
{
    setTabBar(new CheckedTabBar(this));
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!