调整QStackedWidget的大小

时间:2015-06-16 20:28:26

标签: python matplotlib resize pyqt4

我想在我的应用程序中嵌入QStackedWidget。不幸的是,在我的试验中,ApplicationWindow的大小调整不再导致MyMplCanvas的调整大小。

如果我使用另一种方法在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_())

1 个答案:

答案 0 :(得分:4)

这是预期的行为。如果您的层次结构为widget -> layout -> widget -> layout -> ...,则窗口小部件仅会调整大小以适合可用空间。

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

最后一个图层在QWidget内有QWidget且没有布局,因此QStackedWidget不会调整大小。取消注释布局代码后,您将获得完成的行为,因为窗口小部件/布局层次结构遵循交替的窗口小部件和布局。

如果您不想添加其他布局,只需删除self.main_widget并将堆叠小部件直接设置为主窗口的中央窗口小部件。