62884


pyqt5でウィジットをhide()関数で消したときに、ウィンドウ全体のサイズもそれに合わせて最小化したいです。

Hideボタンを押すと右端の緑色の四角が消え、この時にウィンドウ全体がそれに合わせて小さくなるようにしたいです。

どうすればよいのでしょうか。

* * *

**表示されるGUI**  
[![画像1](https://i.stack.imgur.com/UUyOL.png)](https://i.stack.imgur.com/UUyOL.png)

**Hideボタンを押したときのウィンドウの様子**  
[![画像2](https://i.stack.imgur.com/mnt1W.png)](https://i.stack.imgur.com/mnt1W.png)

**Hideボタンを押したときの理想のウィンドウ**  
[![画像3](https://i.stack.imgur.com/bjhUR.png)](https://i.stack.imgur.com/bjhUR.png)

**ソースコード**

[code]

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    
    
    class First(QWidget):
        def __init__(self, parent=None):
            super(First, self).__init__(parent)
    
            self.btn1 = QPushButton("Show", self)
            self.btn1.clicked.connect(self.on_btn1)
            self.btn2 = QPushButton("Hide", self)
            self.btn2.clicked.connect(self.on_btn2)
    
            self.frm1 = QFrame(self)
            self.frm1.setStyleSheet("QWidget { background-color: red }" )
            self.frm1.setFixedSize(200,100)
            self.frm2 = QFrame(self)
            self.frm2.setStyleSheet("QWidget { background-color: blue }" )
            self.frm2.setFixedSize(200,100)
            self.frm3 = QFrame(self)
            self.frm3.setStyleSheet("QWidget { background-color: green }" )
            self.frm3.setFixedSize(200,100)        
    
            layout1=QHBoxLayout()
            layout1.addWidget(self.frm1)
            layout1.addWidget(self.frm2)
            layout1.addWidget(self.frm3)
    
            layout2=QHBoxLayout()
            layout2.addWidget(self.btn1)
            layout2.addWidget(self.btn2)       
    
            layout=QVBoxLayout()
            layout.addLayout(layout1)
            layout.addLayout(layout2)
    
    
            self.setLayout(layout)
    
    
        def on_btn1(self):
            self.frm3.show()
    
        def on_btn2(self):
            self.frm3.hide()
            #self.resize(self.minimumSizeHint())
            #self.resizeEvent()
            #print(self.minimumSizeHint)
            #print(self.minimumWidth)
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        main = First()
        main.show()
        #sys.exit(app.exec_())
        app.exec_()
    
[/code]


CC BY-SA 4.0
2020-02-08T09:28:25.907
62875
2020-02-08T14:24:15.943
26529
question
python pyqt5
Pyqt5でウィジットを消したときにウィンドウのサイズを変更したい


何というか裏技とか力技というのもはばかられる様なイマイチなやり方ですが、こんな感じで実現できます。

ここに直ぐに発生するワンショットタイマーを入れて、その先でリサイズします。

[code]

    def on_btn2(self):
        self.frm3.hide()
    
[/code]

こんな感じです。

[code]

    def on_btn2(self):
        self.frm3.hide()
        QTimer.singleShot(0, self.do_shrink)
    
    def do_shrink(self):
        self.resize(QtCore.QSize())
    
[/code]

もっと綺麗なやり方がありそうですが、わずかな変更で出来たので回答にしておきます。


CC BY-SA 4.0
2020-02-08T11:59:06.493
62879
2020-02-08T11:59:06.493
26370
62875
answer


以下は `activate()` と `adjustSize()` を使う方法です。

※ 実行環境は Python 3.7.5 と PyQt 5.14 です。

[code]

    class First(QWidget):
        def __init__(self, parent=None):
                    :
    
            self.layout = QVBoxLayout()
            self.layout.addLayout(layout1)
            self.layout.addLayout(layout2)
    
            self.setLayout(self.layout)
    
        def on_btn2(self):
            self.frm3.hide()
            self.layout.activate()
            self.adjustSize()
    
[/code]


CC BY-SA 4.0
2020-02-08T14:24:15.943
62884
2020-02-08T14:24:15.943
62875
answer