QTabWidget с флажком в заголовке

#python #checkbox #qt4 #pyqt4 #qtabwidget

#python #флажок #qt4 #pyqt4 #qtabwidget

Вопрос:

Мне было интересно, как создать (используя PyQt4) производный файл QTabWidget с флажком рядом с заголовком каждой вкладки? Вот так:

Ответ №1:

На самом деле я выбрал только подкласс 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:

Наилучшим подходом было бы

  • Создайте пользовательскую панель вкладок, отметьте вкладку (наследуя QTabBar )
  • Создайте пользовательский TabWidget, установите флажок TabWidget (наследующий QTabWidget )
  • Добавьте способ проверить, отмечена вкладка или нет, и, возможно, некоторые сигналы, когда флажок установлен 🙂

Вы должны установить свою пользовательскую панель вкладок в конструкторе checkedtabwidget, вот так:

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

Комментарии:

1. Вам придется реализовать собственную панель вкладок, которая устанавливает флажок рядом с заголовком.

2. Спасибо! Я опубликовал свой код ниже на случай, если он заинтересует других.