Как установить меньший размер окна после скрытия виджета в PyQt5? - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь реализовать функциональность, где вы можете скрыть или показать фигуру одним нажатием кнопки. Однако размер диалогового окна не изменяется, когда фигура снова скрыта. Инструкция self.resize(), похоже, игнорируется. Как я могу сделать это? Использование setFixedSize() работает, однако я не хочу, чтобы размер был фиксированным. Я думал, что смогу как-нибудь «расфиксировать» его, используя setSizePolicy(), но это не помогло.

import sys
import matplotlib.pyplot as plt

from PyQt5.Qt import QSizePolicy
from PyQt5.QtWidgets import (
    QDialog, QApplication, QGridLayout, QWidget, QGroupBox, QPushButton
)
from matplotlib.backends.backend_qt5agg import \
    FigureCanvasQTAgg as FigureCanvas


class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.layout = QGridLayout()
        self.setLayout(self.layout)

        self.settings = QGroupBox('Settings:')
        self.settingsLayout = QGridLayout()
        self.settings.setLayout(self.settingsLayout)
        self.showFigureBtn = QPushButton('Show Figure')
        self.settingsLayout.addWidget(self.showFigureBtn)
        self.layout.addWidget(self.settings)

        self.figureWidget = QWidget()
        self.figureWidget.setMinimumSize(300, 300)
        self.figureLayout = QGridLayout(self.figureWidget)
        self.fig, self.ax = plt.subplots()
        self.canvas = FigureCanvas(self.fig)
        self.figureLayout.addWidget(self.canvas)
        self.figureWidget.setLayout(self.figureLayout)
        self.layout.addWidget(self.figureWidget)
        self.figureWidget.setVisible(False)

        self.showFigureBtn.clicked.connect(self.toggle_figure)

        self.min_size = (300, 100)
        self.resize(*self.min_size)

    def toggle_figure(self):
        state = not self.figureWidget.isVisible()
        if state:
            self.showFigureBtn.setText('Hide Figure')
            self.min_size = self.size()
            self.figureWidget.setVisible(state)
        else:
            self.showFigureBtn.setText('Show Figure')
            self.figureWidget.setVisible(state)
            self.resize(self.min_size)
            # self.setFixedSize(self.min_size)
            # self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 19 марта 2020

Один из возможных способов - отрегулировать размер с помощью AdjustSize (), а затем установить желаемый размер:

def toggle_figure(self):
    state = not self.figureWidget.isVisible()
    if state:
        self.showFigureBtn.setText("Hide Figure")
        self.min_size = self.size()
        self.figureWidget.setVisible(state)
    else:
        self.showFigureBtn.setText("Show Figure")
        self.figureWidget.setVisible(state)
        <b>self.adjustSize()</b>
        self.resize(self.min_size)
...