#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. Спасибо! Я опубликовал свой код ниже на случай, если он заинтересует других.