2015-06-16 23 views
1

我想在我的應用程序中嵌入QStackedWidget。不幸的是,在我的試驗中,調整ApplicationWindow的大小並不會導致調整大小MyMplCanvas了。調整QStackedWidget的大小

如果我使用替代方法將MyMplCanvas包含在ApplicationWindow中,調整大小將按預期工作。所以我期望MyMplCanvas的定義是正確的,而且必須在QStackedWidget處調整一些東西。

from PyQt4 import QtGui, QtCore 
import sys 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 

class MyMplCanvas(FigureCanvas): 
    def __init__(self, parent=None): 
     self.fig = Figure() 
     FigureCanvas.__init__(self, self.fig) 

     self.setParent(parent) 
     self.fig.add_subplot(111).plot((1, 2, 3), (4, 3, 4))  

     FigureCanvas.setSizePolicy(self, 
            QtGui.QSizePolicy.Expanding, 
            QtGui.QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 

class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.main_widget = QtGui.QWidget(self) 

     # Plot object 
     plot1=MyMplCanvas() 

     # With this definition it would resize as expected 
     # l = QtGui.QVBoxLayout(self.main_widget) 
     # l.addWidget(plot1) 

     # Unfortunatly it is not resizing if I use QStackedWidget 
     self.viewsStack = QtGui.QStackedWidget(self.main_widget) 
     self.viewsStack.setSizePolicy(QtGui.QSizePolicy.Expanding, 
             QtGui.QSizePolicy.Expanding)   
     self.viewsStack.addWidget(plot1) 

     # General code 
     self.main_widget.setFocus() 
     self.setCentralWidget(self.main_widget) 

if __name__ == '__main__': 
    qApp = QtGui.QApplication(sys.argv) 
    aw = ApplicationWindow() 
    aw.show() 
    sys.exit(qApp.exec_()) 

回答

4

這是預期的行爲。如果您的層次結構爲widget -> layout -> widget -> layout -> ...,則小部件將只調整大小以適應可用空間。

目前你有ApplicationWindow (QMainWindow) -> QMainWindow layout (internally created by Qt) -> main_widget (QWidget) -> viewsStack (QStackedWidget)

最後一層有一個QWidget內的QWidget沒有佈局,因此QStackedWidget不調整。當您取消佈局代碼的註釋時,由於您的窗口小部件/佈局層次結構遵循交替的窗口小部件和佈局,您將會獲得所需的行爲。

如果您不想添加額外的佈局,只需刪除self.main_widget並將堆疊的小部件直接設置爲主窗口的中央小部件。

+0

謝謝你的有益解釋three_pinapples。這聽起來很合理。不幸的是,我沒有時間去檢查它是否有個人原因。但隨着你的提示,我有信心取得成功。 – BerndGit

+0

測試了您的反饋並找到了解決方案。謝謝! – BerndGit

+0

幾周後,我終於找到時間繼續我的項目。不幸的是後續問題發生:http://stackoverflow.com/questions/33679216/resizing-of-qstackedwidget-part-2。也許你有一個quickfix three_pineapples?謝謝, – BerndGit

相關問題