在标题中带有复选框的QTabWidget

4
我想知道如何使用 PyQt4 创建一个派生的 QTabWidget,每个选项卡标题旁边都有一个复选框?就像这样:
2个回答

9

实际上,我选择只对QTabWidget进行子类化。
复选框是在创建新选项卡时添加的,并保存到列表中以便获取其索引。
setCheckState/isChecked方法旨在控制每个选项卡指定的复选框的状态。
最后,捕获并重新发出“stateChanged(int)”信号,其中包含一个额外的参数,指定所涉及的复选框的索引。

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)

这也许不是完美的做法,但至少它保持了简单,并且涵盖了我所有的需求。


2
最好的方法是:
  • 创建一个自定义的TabBar,CheckedTabBar(继承QTabBar
  • 创建一个自定义的TabWidget,CheckedTabWidget(继承QTabWidget
  • 添加一种测试选项卡是否被选中的方法,以及在复选框切换时可能需要一些信号 :)

您应该在checkedtabwidget构造函数中设置自定义的tabbar,如下所示:

CheckedTabWidget::CheckedTabWidget(QWidget* parent) : QTabWidget(parent)
{
    setTabBar(new CheckedTabBar(this));
}

1
你需要实现自己的选项卡栏,将复选框放置在标题旁边。 - gnud
谢谢!我在下面发布了我的代码,以防它对其他人有兴趣。 - Jib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接