Странная вещь о вкладке .. Помогите мне решить - PullRequest
0 голосов
/ 18 декабря 2009

Я только начал изучать pyqt .. Когда я экспериментировал с панелью вкладок, я столкнулся с этим .. В качестве минимального примера я хочу показать кнопку на tab1 и метку на tab2 .. Вот что я сделал

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, функционировал хорошо. В любом случае я не вижу связи между виджетом и панелью вкладок. Вкладка панели вкладок создается независимо, и поэтому вкладка вкладок. Оба имеют заголовки вкладок, которые показаны только для панели вкладок. Но если я установил индекс как o, то отобразится первая вкладка вместе с widgetForTab1 ..

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

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 соответственно .. Можете ли вы сказать мне почему это происходит ??? Что я должен сделать, чтобы решить эту проблему ???

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Я знаю, что прошло много времени с тех пор, как был задан этот вопрос, но я заметил, что ваш ответ на предыдущий ответ состоял в том, что вам нужно было иметь возможность настраивать вкладки, используя таблицы стилей. Это также возможно при использовании QTabWidget! Поскольку все QWidget имеют setStyleSheet () , а QTabWidget использует QTabBar под капотом, вы можете в значительной степени использовать одну и ту же таблицу стилей из коробки. Например, вот таблица стилей, которую я использую, чтобы изменить внешний вид вкладок в моем веб-браузере на основе PyQt / PySide, который использует 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. Вы также можете проверить разделы QTabBar и QTabWidget на официальной странице примеров таблиц стилей Qt.

1 голос
/ 18 декабря 2009

Лучший способ выполнить то, что вы здесь пытаетесь - это использовать 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_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...