2017-11-03 8 views
0

각 탭의 테이블 위젯을 포함하는 탭 위젯이 있으며 옵션이있는 도킹 위젯도 있습니다. 옵션 중 하나는 열 개수이며, 열 개수 스핀 상자 값이 변경되는 즉시 변경하려고합니다. 그러나 다른 탭으로 전환 할 때 스핀 상자 값 (및 다른 모든 옵션)을 재설정하여 특정 탭의 설정으로 전환하고 싶습니다.각 탭 위젯에 대한 PyQt 옵션

제 질문은 이것을 최선으로 수행하고 도킹 위젯으로 옵션을 유지하는 것입니다. 모든 탭 위젯에 대한 변수로 모든 설정을 저장 한 다음 새 탭이 열릴 때마다 값을 변경할 수 있지만 더 나은 솔루션이있을 수 있습니다.

from PyQt5 import QtWidgets, QtCore 

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent = None): 
     super(MainWindow, self).__init__() 
     self.__setup__() 

    def __setup__(self): 
     self.resize(400, 400) 
     tabWidget = TabWidget(self) 
     self.setCentralWidget(tabWidget) 

     options = Options(self) 
     optionsDock = QtWidgets.QDockWidget() 
     optionsDock.setWidget(options) 
     optionsDock.setWindowTitle("Options") 
     self.addDockWidget(QtCore.Qt.TopDockWidgetArea, optionsDock) 

     options.spinBox_columns.valueChanged.connect(lambda: tabWidget.tabWidget.currentWidget(). 
                setColumnCount(options.spinBox_columns.value())) 

class Options(QtWidgets.QWidget): 
    def __init__(self, parent): 
     super(Options, self).__init__(parent) 
     self.__setup__() 

    def __setup__(self): 
     self.spinBox_columns = QtWidgets.QSpinBox() 
     self.spinBox_columns.setValue(1) 
     self.spinBox_columns.setMinimum(1) 

     layout = QtWidgets.QVBoxLayout() 
     layout.addWidget(self.spinBox_columns) 
     self.setLayout(layout) 

class TabWidget(QtWidgets.QWidget): 
    def __init__(self, parent): 
     super(TabWidget, self).__init__(parent) 
     self.__setup__() 

    def __setup__(self): 
     self.tabWidget = QtWidgets.QTabWidget() 

     for i in range(3): 
      widget = QtWidgets.QTableWidget() 
      widget.setColumnCount(1) 
      widget.setRowCount(3) 
      self.tabWidget.addTab(widget, "Column " + str(i)) 

     layout = QtWidgets.QVBoxLayout() 
     layout.addWidget(self.tabWidget) 
     self.setLayout(layout) 

def main(): 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

답변

1

넌 탭의 인덱스에 의해 제공된 currentChanged 신호 연결이 후 다음의 QTabWidget 액세스, 그 인덱스와 관련된 인덱스를 획득하기 위해 상기 widget() 방법을 사용하는 장소에 사용하는 열 수를 구하는 QSpinBox 값입니다.

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.__setup__() 

    def __setup__(self): 
     self.resize(400, 400) 
     tabWidget = TabWidget(self) 
     self.setCentralWidget(tabWidget) 

     options = Options(self) 
     optionsDock = QtWidgets.QDockWidget() 
     optionsDock.setWidget(options) 
     optionsDock.setWindowTitle("Options") 
     self.addDockWidget(QtCore.Qt.TopDockWidgetArea, optionsDock) 

     tabWidget.tabWidget.currentChanged.connect(lambda index: options.spinBox_columns. 
                setValue(tabWidget.tabWidget.widget(index).columnCount())) 

     options.spinBox_columns.valueChanged.connect(lambda value: tabWidget.tabWidget.currentWidget(). 
                setColumnCount(value))