2013-10-15 2 views
0

У меня есть QTabWidget и макет с некоторыми виджетами и вспомогательными макетами, которые я хочу показать на вкладках QTabWidget. что я хочу сделать, это добавить этот макет к первой вкладке (по умолчанию), и если пользователь перейдет на следующую вкладку, я хочу показать тот же самый макет и добавить некоторые виджеты рядом с ним. это макет, который я говорю:Есть ли способ показать виджету это две разные вкладки?

self.right_tab_layout = QVBoxLayout() 
    self.right_tab_widget = QWidget() 
    self.right_tab_title_label = QLabel("Select full files path:") 
    self.simoderev_layout = QHBoxLayout() 
    self.simoderev_widget = QWidget() 
    self.simoderev_checkbox = QCheckBox("use simoderev as base: ") 
    self.simoderev_combobox = QComboBox() 
    self.paths_label = QLabel("paths:") 

    self.right_tab_widget.setLayout(self.right_tab_layout) 

    self.simoderev_widget.setLayout(self.simoderev_layout) 
    self.simoderev_widget.setMaximumWidth(250) 

    self.simoderev_layout.addWidget(self.simoderev_checkbox) 
    self.simoderev_layout.addWidget(self.simoderev_combobox) 
    self.simoderev_layout.setContentsMargins(0,0,0,0) 

    self.right_tab_layout.addWidget(self.right_tab_title_label) 
    self.right_tab_layout.addWidget(self.simoderev_widget) 
    self.right_tab_layout.addWidget(self.paths_label) 

есть ли способ сделать это?

ответ

1

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

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

class CustomWidget(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(CustomWidget, self).__init__(parent) 
     layout = QtGui.QVBoxLayout(self) 
     self.title_label = QtGui.QLabel("Select full files path:") 
     self.simoderev_widget = QtGui.QWidget() 
     simoderev_layout = QtGui.QHBoxLayout(self.simoderev_widget) 
     self.simoderev_checkbox = QtGui.QCheckBox("use simoderev as base: ") 
     self.simoderev_combobox = QtGui.QComboBox() 
     self.simoderev_widget.setMaximumWidth(250) 
     simoderev_layout.addWidget(self.simoderev_checkbox) 
     simoderev_layout.addWidget(self.simoderev_combobox) 
     simoderev_layout.setContentsMargins(0,0,0,0) 
     self.paths_label = QtGui.QLabel("paths:") 
     layout.addWidget(self.title_label) 
     layout.addWidget(self.simoderev_widget) 
     layout.addWidget(self.paths_label) 

Если вы хотите, чтобы быть же, вот Hacky решение. Вы должны подключить сигнал вашего табуйтета currentChanged к слоту, который перемещает ваш пользовательский виджет с одной вкладки на другую.

class MyTabWidget(QtGui.QTabWidget): 

    def __init__(self, parent = None): 
     super(MyTabWidget, self).__init__(parent) 

     self.subwidget = CustomWidget(self) 

     self.left_tab_widget = QtGui.QWidget() 
     self.leftLayout = QtGui.QVBoxLayout(self.left_tab_widget) 
     self.leftLayout.addWidget(self.subwidget) 

     self.right_tab_widget = QtGui.QWidget(self) 
     self.rightLayout = QtGui.QVBoxLayout(self.right_tab_widget) 
     label = QtGui.QLabel("Some additional data", self.right_tab_widget) 
     self.rightLayout.addWidget(label) 

     self.addTab(self.left_tab_widget, "Left Tab") 
     self.addTab(self.right_tab_widget, "Right Tab") 

     self.currentChanged.connect(self.onCurrentChanged) 

    def onCurrentChanged(self, index): 
     if index == 0: 
      self.leftLayout.addWidget(self.subwidget) 
     else: 
      self.rightLayout.addWidget(self.subwidget) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    widget = MyTabWidget() 
    widget.show() 
    app.exec_() 
+0

Это работает. но у меня вопрос, для чего нужен супер()? – user2234234

+0

super() используется для вызова базового класса '__init__'. Вы могли бы заменить 'super (CustomWidget, self) .__ init __ (parent)' с 'QtGui.QWidget .__ init __ (self, parent)' – Yoann

Смежные вопросы