调整 QStackedWidget 的大小
Resizing of QStackedWidget
我想在我的应用程序中嵌入一个 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_())
这是预期的行为。如果您的层次结构是 widget -> layout -> widget -> layout -> ...
.
,小部件将仅调整大小以适应可用的 space
目前你有 ApplicationWindow (QMainWindow) -> QMainWindow layout (internally created by Qt) -> main_widget (QWidget) -> viewsStack (QStackedWidget)
最后一层在 QWidget
中有一个 QWidget
,没有布局,因此 QStackedWidget
不会调整大小。当您取消注释布局代码时,您会得到加速行为,因为您的 widget/layout 层次结构遵循交替的小部件和布局。
如果您不想添加额外的布局,只需删除 self.main_widget
并直接将堆叠小部件设置为主 window 的中央小部件。
我想在我的应用程序中嵌入一个 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_())
这是预期的行为。如果您的层次结构是 widget -> layout -> widget -> layout -> ...
.
目前你有 ApplicationWindow (QMainWindow) -> QMainWindow layout (internally created by Qt) -> main_widget (QWidget) -> viewsStack (QStackedWidget)
最后一层在 QWidget
中有一个 QWidget
,没有布局,因此 QStackedWidget
不会调整大小。当您取消注释布局代码时,您会得到加速行为,因为您的 widget/layout 层次结构遵循交替的小部件和布局。
如果您不想添加额外的布局,只需删除 self.main_widget
并直接将堆叠小部件设置为主 window 的中央小部件。