2014-06-06 78 views
0

我對某些後處理使用QTabWidget。 最初,該選項卡的內容是一個打開txt文件的按鈕。點擊該按鈕後,選項卡的內容會發生變化,並根據txt文件中的數據繪製圖表。此外,還有一個關閉該圖的按鈕。PySide - 如何使用QStackedWidget關閉窗口小部件後重置CentralWidget

使用QStackedWidget時,「openFileWidget」是一個CentralWidget,它在打開txt文件後被替換爲「newWindow」小部件。如果關閉「newWindow」小部件,我會回到(空)選項卡。 如果我想讓「openFileWidget」重新出現,那麼最好的方法是什麼?當newWindow關閉時,是否仍然需要使用takeAt

import os, sys 
from PySide import QtCore, QtGui 

class MainStartTabWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MainStartTabWindow, self).__init__(parent) 
     tabWidget = QtGui.QTabWidget() 
     tabWidget.addTab(tab1Tab(), self.tr("tab 1")) 

     mainLayout = QtGui.QVBoxLayout() 
     mainLayout.addWidget(tabWidget) 
     self.setLayout(mainLayout) 


class tab1Tab(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(tab1Tab, self).__init__(parent) 
     self.initTab1Content() 

    def initTab1Content(self): 
     self.centralOpenFile = QtGui.QStackedWidget() 
     self.setCentralWidget(self.centralOpenFile) 
     widgetOpenFile = openFileWidget(self) 
     widgetOpenFile.openFileButton.clicked.connect(self.setOpenFile) 
     widgetOpenFile.openFileButton.clicked.connect(self.FileOpened) 
     self.centralOpenFile.addWidget(widgetOpenFile) 

    def FileOpened(self): 
     FileOpened_widget = newWindow(self.path) 
     self.centralOpenFile.addWidget(FileOpened_widget) 
     self.centralOpenFile.setCurrentWidget(FileOpened_widget) 

    def setOpenFile(self): 
     options = QtGui.QFileDialog.Options() 
     fileChoice = "txt (*.txt)" 
     self.path, filtr = QtGui.QFileDialog.getOpenFileName(self, "Open file", "", fileChoice, "", options) 

     return self.path 


class openFileWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(openFileWidget, self).__init__(parent) 

     self.openFileButton = QtGui.QPushButton("click to open") 
     self.openFileButton.setFixedSize(150,150) 
     layoutNoFileYet = QtGui.QGridLayout() 
     layoutNoFileYet.addWidget(self.openFileButton, 1, 1) 
     self.setLayout(layoutNoFileYet) 


class newWindow(QtGui.QMainWindow): 
    def __init__(self, PathToPlanFile, parent=None): 
     super(newWindow, self).__init__(parent) 
     self.createFrameUI() 

    def createFrameUI(self): 
     self.frameUI = QtGui.QWidget() 
     self.buttonClose = QtGui.QPushButton("close") 
     self.buttonClose.clicked.connect(self.close) 

     self.label = QtGui.QLabel("plot based on openend file") 

     layoutFileLoaded = QtGui.QGridLayout() 
     layoutFileLoaded.addWidget(self.buttonClose, 1, 1) 
     layoutFileLoaded.addWidget(self.label, 2, 1) 

     self.frameUI.setLayout(layoutFileLoaded) 
     self.setCentralWidget(self.frameUI) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    testPlot = MainStartTabWindow() 
    testPlot.show() 
    sys.exit(app.exec_()) 




if __name__ == "__main__": 
    main() 

回答

0

我會完全改變你的方法。你只需要一個QMainWindow。沒有必要使用openFileWidget;它只是一個按鈕。接下來我要做的就是創建一個定製的QTabWidget,編輯addTab來打開一個文件。

import os, sys 
from PySide import QtCore, QtGui 

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

     self.main_widget = QtGui.QTabWidget() 
     self.setCentralWidget(self.main_widget) 

     self.main_widget.addTab(Page1(), "Tab 1") 
     self.main_widget.addTab(Page2(), "Tab 2") 
     self.main_widget.addTab(Page3(), "Tab 3") 
     self.main_widget.addTab(Page4(), "Tab 4") 

     self.main_widget.setCurrentIndex(0) 
    # end Constructor 
# end MainWindow 

class Page1(QtGui.QWidget): 
    """First page to display.""" 

    def __init__(self): 
     super().__init__() 

     self.main_layout = QtGui.QVBoxLayout() 
     self.setLayout(self.main_layout) 

     # Widgets 
     self.hlayout = QtGui.QHBoxLayout() 
     self.hlayout.setContentsMargins(0, 0, 0, 0) 
     self.read_btn = QtGui.QPushButton("Open File") 
     self.clear_btn = QtGui.QPushButton("Clear Data") 

     self.hlayout.addWidget(self.read_btn) 
     self.hlayout.addWidget(self.clear_btn) 

     # Display data here 
     self.display = DisplayWidget("plot based on openend file") 

     # Properties 
     self.data = None 

     # Signals 
     self.read_btn.clicked.connect(self.read_file) 
     self.clear_btn.clicked.connect(self.display.clearData) 

     # Layout 
     self.main_layout.addLayout(self.hlayout) 
     self.main_layout.addWidget(self.display) 
    # end Constructor 

    def read_file(self, path=""): 
     """Read file dialog.""" 
     if path == "": 
      options = QtGui.QFileDialog.Options() 
      fileChoice = "txt (*.txt)" 
      path, _ = QtGui.QFileDialog.getOpenFileName(self, "Open file", "", 
                  fileChoice, "", options) 

     # Cancel button was pressed 
     if path == "": 
      return 


     with open(path, "r") as file: 
      lines = file.readlines() 
     # close file 

     self.display.setData(lines) 
    # end read_file 

    def set_data(self, data=None): 
     """Set the data to display here.""" 

    # end set_data 
# end class Page1 

class DisplayWidget(QtGui.QWidget): 
    def __init__(self, text=""): 
     super().__init__() 

     # Layout 
     self.main_layout = QtGui.QVBoxLayout() 
     self.setLayout(self.main_layout) 

     # Widgets Have all of your display stuff here 
     self.label = QtGui.QLabel(text) 

     # Properties 
     self.data = None 

     # Add Layout 
     self.main_layout.addWidget(self.label) 
    # end Constructor 

    def setData(self, data): 
     """Set the data to show the plot.""" 
     self.data = data 

     # Plot stuff here 
     self.label.setText(str(data)) 
    # end setValue 

    def clearData(self): 
     """Clear the plot data.""" 
     self.data = None 

     # Clear data here 
     self.label.setText("Open a file to display data") 
    # end clearData 
# end class DisplayWidget 

class Page2(QtGui.QWidget): 
    pass 
# end class Page2 

class Page3(QtGui.QWidget): 
    pass 
# end class Page3 

class Page4(QtGui.QWidget): 
    pass 
# end class Page4 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    testPlot = MainWindow() 
    testPlot.show() 
    sys.exit(app.exec_()) 




if __name__ == "__main__": 
    main() 

我不會讓用戶關閉選項卡。只要他們能夠清除並重新加載數據,如果他們願意。如果你真的希望他們關閉,然後讓清除數據按鈕關閉displaywidget並讓讀取文件按鈕每次都創建一個新的小部件。我不認爲你需要每次創建一個新的小部件。如果你不喜歡這些標籤,你可能想看看QToolBox。

+0

非常感謝您的完整答案和詳細的幫助Justin! 確實,我的方法可能過於複雜。但我想要實現的是具有3-4個選項卡的應用程序,其中每個選項卡都有其自己的功能。所以基本上每個選項卡都是具有不同功能的主窗口,並且我希望每次重新加載某些數據時都能夠(重新)使用給定的選項卡。 這就是爲什麼我開始與QStackedWidgets。 – LievenB

+0

我編輯了答案。如果是這種情況,那麼不要提供關閉按鈕。只需清除數據。如果你關閉了,那麼每次讀入文件時都必須重新創建這個小部件。如果你關閉它,然後存儲你讀入的數據,那麼你可以根據需要重新加載數據。嘗試嵌套在DisplayWidget內部更改的項目。 – HashSplat

+0

太好了,非常感謝您的完整解釋! – LievenB