每个选项卡小部件的 PyQt 选项

PyQt Options for each Tab Widget

我有一个选项卡小部件,其中包含每个选项卡的 table 个小部件,我还有一个带有选项的停靠小部件。其中一个选项是列数,我想在列数旋转框值发生变化时立即更改它。但是当切换到不同的选项卡时,我希望旋转框值(和所有其他选项)重置/切换到该特定选项卡的设置。

我的问题是如何最好地做到这一点并且仍然具有作为停靠小部件的选项。我可以将所有设置存储为每个选项卡小部件的变量,然后在每次打开新选项卡时更改值,我想,但也许有更好的解决方案。

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()

你必须连接标签索引提供的currentChanged信号,然后使用widget()方法获取与该索引关联的索引,然后访问它的QTabWidget并获取使用它将值放置到 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))