#python #matplotlib #pyqt5 #qdockwidget
Вопрос:
Я создаю приложение в pyqt5 для построения нескольких фигур рядом и выше/ниже друг друга, и я хочу, чтобы графики были закреплены. Результат ведет себя не так, как я хочу/ожидал бы, и после долгого поиска ответов/решений в Интернете я все еще не знаю, почему.
Пока что это мой код:
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure from PyQt5 import QtWidgets, QtCore import traceback import logging def exception_hook(exc_type, exc_value, exc_tb): tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb)) logging.error('n' tb) QtWidgets.QApplication.quit() class PlotWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(PlotWindow, self).__init__(parent=parent) self.setWindowTitle('plot window') self.setCentralWidget(QtWidgets.QWidget(self)) def add_figure(self, figure): mplCanvas = FigureCanvas(figure) mplCanvas.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) dockableMplCanvas = QtWidgets.QDockWidget(self) dockableMplCanvas.setWidget(mplCanvas) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dockableMplCanvas) if __name__ == '__main__': import sys logging.basicConfig(level=logging.DEBUG) logging.getLogger('matplotlib').setLevel(logging.ERROR) sys.excepthook = exception_hook app = QtWidgets.QApplication(sys.argv) pw = PlotWindow() for _ in range(4): fig = Figure(tight_layout=True) ax = fig.add_subplot() pw.add_figure(fig) pw.show() exit(app.exec_())
Это приводит к следующему:
Если я теперь переставлю графики, сначала поместив один из них слева от трех других:
..And then putting one underneath the one on the left:
Теперь, если я масштабирую окно, пространство между двумя столбцами графиков расширяется, но графики не расширяются, чтобы заполнить пространство:
Это почему? и как я могу это исправить?
Комментарии:
1. Если у вас есть N вопросов, создайте N сообщений. Таким образом, сообщение должно содержать только один конкретный вопрос, наличие большого количества вопросов подразумевает, что ваше сообщение слишком широкое, чтобы его можно было закрыть.
2. @eyllanesc хорошо, точка принята.
Ответ №1:
Центральный виджет изменяет размер, чтобы заполнить пространство между двумя столбцами графиков, решение состоит в том, чтобы добавить:
self.centralWidget().setFixedSize(0, 0)
чтобы предотвратить расширение центрального виджета