2011-04-28 90 views

回答

8

其實我選擇只子類QTabWidget。
在創建新選項卡時添加了複選框,並將其保存到列表中以獲取其索引。
setCheckState/isChecked方法旨在控制由其選項卡索引指定的每個CheckBox的狀態。
最後,「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
  • 添加一種方式來測試選項卡是否被選中,當複選框被切換時可能會有一些信號:)

你應該設置自定義的TabBar在checkedtabwidget構造,像這樣:

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

謝謝,但我不明白在哪裏把CheckBox ... – Jib 2011-04-28 17:58:00

+1

你必須實現自己的標籤欄,按標題放置複選框。 – gnud 2011-04-29 07:43:24

+0

謝謝!我發佈了我的代碼以防其他人感興趣。 – Jib 2011-05-07 11:05:13