4

我想知道如何创建(使用 PyQt4)QTabWidget在每个选项卡标题旁边带有复选框的派生?像这样:

4

2 回答 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)

这可能不是做事的完美方式,但至少它仍然非常简单并且满足了我的所有需求。

于 2011-05-07T11:01:56.007 回答
2

最好的方法是

  • 创建自定义TabBar,CheckedTabBar(继承QTabBar
  • 创建自定义TabWidget,CheckedTabWidget(继承QTabWidget
  • 添加一种方法来测试选项卡是否被选中,并可能在复选框被切换时发出一些信号:)

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

CheckedTabWidget::CheckedTabWidget(QWidget* parent) : QTabWidget(parent)
{
    setTabBar(new CheckedTabBar(this));
}
于 2011-04-28T12:31:03.000 回答