2009-12-18 88 views
0

我剛開始學習pyqt ..當我在試驗tabbar我遇到這個..作爲一個最小的例子,我想在tab1中顯示一個按鈕和在tab2中的標籤。這裏就是我所做的tabbar奇怪的事情..幫我解決

from PyQt4 import QtGui  
class Ui_TabWidget(QtGui.QTabWidget):   
    def __init__(self,parent=None): 
     QtGui.QTabWidget.__init__(self,parent) 

     self.setObjectName("TabWidget") 
     self.resize(400, 300) 
     self.setWindowTitle(QtGui.QApplication.translate("TabWidget", "TabWidget", None, QtGui.QApplication.UnicodeUTF8)) 

     #Creating the tabbar 
     self.tabBar=QtGui.QTabBar(self) 

     #Adding the first tab 
     self.tabBar.addTab("tab1") 
     self.tabBar.setTabText(0,"TAB1") 

     #The widget intended for tab1 
     self.widgetforTab1=QtGui.QWidget() 
     self.addTab(self.widgetforTab1,"") 
     self.buttonForTab1=QtGui.QPushButton(self.widgetforTab1) 
     self.buttonForTab1.setText("Button in Tab1") 

     #Adding the second Tab 
     self.tabBar.addTab("tab2") 
     self.tabBar.setTabText(1,"TAB2") 

     #The widget intended for tab2 
     self.widgetForTab2=QtGui.QWidget() 
     self.addTab(self.widgetForTab2,"") 
     self.labelForTab2=QtGui.QLabel(self.widgetForTab2) 
     self.labelForTab2.setText("Label in Tab2") 

     #Adding the tabbar to the tabwidget 
     self.setTabBar(self.tabBar) 

     self.tabBar.setMovable(True) 
     self.setCurrentIndex(0) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    ui = Ui_TabWidget() 
    ui.show() 
    sys.exit(app.exec_()) 

在上面的程序用於TAB1和TAB2小部件運轉良好。無論如何,我無法看到小部件和標籤欄之間的連接。標籤欄選項卡是獨立創建的,因此也是tabwidget選項卡。這兩個選項卡標題是Tabbar單獨給出的。但是,如果我將索引設置爲o第一個選項卡與widgetForTab1一起顯示..

在我的第二個程序中,小部件和tabbar之間缺乏耦合事業的問題..

from PyQt4 import QtGui  
class Ui_TabWidget(QtGui.QTabWidget): 
    def __init__(self,parent=None): 
     QtGui.QTabWidget.__init__(self,parent) 

     self.setObjectName("TabWidget") 
     self.resize(400, 300) 
     self.setWindowTitle(QtGui.QApplication.translate("TabWidget", "TabWidget", None, QtGui.QApplication.UnicodeUTF8)) 

     #Creating the tabbar 
     self.tabBar=QtGui.QTabBar(self) 

     #Adding the first tab 
     self.tabBar.addTab("tab1") 
     self.tabBar.setTabText(0,"TAB1") 

     #Adding the second Tab 
     self.tabBar.addTab("tab2") 
     self.tabBar.setTabText(1,"TAB2") 

     self.tabBar.setMovable(True) 
     #Adding the tabbar to the tabwidget 
     self.setTabBar(self.tabBar) 

     #The widget intended for tab1 
     self.widgetforTab1=QtGui.QWidget() 
     self.addTab(self.widgetforTab1,"") 
     self.buttonForTab1=QtGui.QPushButton(self.widgetforTab1) 
     self.buttonForTab1.setText("Button in Tab1") 

     #The widget intended for tab2 
     self.widgetForTab2=QtGui.QWidget() 
     self.addTab(self.widgetForTab2,"") 
     self.labelForTab2=QtGui.QLabel(self.widgetForTab2) 
     self.labelForTab2.setText("Label in Tab2") 

     self.setCurrentIndex(0) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    ui = Ui_TabWidget() 
    ui.show() 
    sys.exit(app.exec_()) 

第二程序的輸出太可怕了。我有四個與前兩個標籤,沒有標籤的文本和標籤在TAB1 TAB2中在TAB2有按鈕,標籤,標籤和標籤Tab2分別..你能告訴我爲什麼發生這種情況?我該怎麼做才能解決這個問題?

回答

1

完成您在此嘗試的最佳方法是使用QTabWidget。它比QTabBar方便得多,並且可以99.99%的時間完成你想​​要的任何事情。

下面是與QTabWidget工作的一個典型的例子:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 


class AppForm(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 

     self.create_main_frame()  

    def create_main_frame(self):   
     tabs = QTabWidget() 

     # Create first page 
     page1 = QWidget() 
     button1 = QPushButton('joy', page1) 
     vbox1 = QVBoxLayout() 
     vbox1.addWidget(button1) 
     page1.setLayout(vbox1) 

     # Create second page 
     page2 = QWidget() 
     label2 = QLabel('here I am') 
     button2 = QPushButton('button on second page', page1) 
     vbox2 = QVBoxLayout() 
     vbox2.addWidget(label2) 
     vbox2.addWidget(button2) 
     page2.setLayout(vbox2) 

     tabs.addTab(page1, 'First page') 
     tabs.addTab(page2, 'Second page') 

     self.setCentralWidget(tabs) 



if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    form = AppForm() 
    form.show() 
    app.exec_() 
+0

感謝您的回覆..但是選擇tabbar的原因是它可以使用樣式表進行自定義(選擇選項卡,當前選項卡等)。爲了達到這些效果,除了使用tabbar外沒有其他選擇。 – Jeba 2009-12-18 09:43:48

2

我知道它已經有一段時間,因爲這個問題被問過,但我注意到你以前的答案回答是,你需要能夠自定義選項卡使用樣式表。這在使用QTabWidget時也是可能的!由於所有QWidgets都有setStyleSheet(),並且QTabWidget在底層使用了QTabBar,所以幾乎可以使用相同的樣式表。例如,這裏有一個樣式表,我使用的是改變我的基於PySide-的PyQt /網頁瀏覽器選項卡的外觀,它採用QTabWidget:

QTabWidget::tab-bar { 
    left: 2px; /* move to the right by 2px */ 
} 

/* Style the tab using the tab sub-control. Note that 
* it reads QTabBar _not_ QTabWidget 
*/ 
QTabBar::tab { 
    min-width: 24px; 
    max-width: 280px; 
    padding: 2px 5px; 
    font-size: .85em; 
} 

QTabBar::tab:!selected { 
    margin-top: 2px; /* make non-selected tabs look smaller */ 
} 

/* make use of negative margins for overlapping tabs */ 
QTabBar::tab:selected { 
    /* expand/overlap to the left and right by 4px */ 
    margin-left: -2px; 
    margin-right: -2px; 
} 

QTabBar::tab:first:selected { 
    /* first selected tab has nothing to overlap with on the left */ 
    margin-left: 0; 
} 

QTabBar::tab:last:selected { 
    /* last selected tab has nothing to overlap with on the right */ 
    margin-right: 0; 
} 

QTabBar::tab:only-one { 
    /* if there is only one tab, we don't want overlapping margins */ 
    margin-left: 0; 
    margin-right: 0; 
} 

本身肯定需要一些調整樣式表,但它確實證明將樣式應用於QTabWidget時有可能。您還可以在官方Qt樣式表示例頁面查看QTabBar and QTabWidget section