Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

python - Resize QMainWindow to minimal size after content of layout changes

I'm using a subclass of QMainWindow, in which I declared a central widget. This widget contains, among other things, a QGridLayout, which holds a set of buttons. The amount of buttons can grow or shrink, depending on the user's input. The spacing is set to zero, so that all buttons are clumped together. By default, it looks like this:

Layout by default

If the amount of buttons is increased, the grid and window will grow too just fine; if, however, the amount of buttons is reduced, it will look like this:

Layout done wrong

Now I would like to resize the window/layout/widget so that all buttons may use the minimal space. I've tried various things, but all to no avail. I had a look at this and this question, as well at various threads in the Qt board, but none of them worked for me.

My layout is build as follows:

self.grid = QtGui.QGridLayout()
self.grid.setSpacing(0)

hBox = QtGui.QHBoxLayout()
hBox.addWidget(...)

vBox = QtGui.QVBoxLayout(self.widget)
vBox.addLayout(hBox)
vBox.addLayout(self.grid)

self.setCentralWidget(self.widget)

I tried resizing it with ...

self.widget.layout().activate()
self.resize(self.minimumSize())
# self.resize(self.sizeHint())

... and various other methods. I also tried setting the size policy of my window and grid.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You can resize the window to minimumSizeHint() after the number of widgets is changed :

self.resize(minimumSizeHint())

This will shrink the window to minimum size. But you should consider that the minimum size is not computed until some events are processed in the event loop. So when the number of buttons are changed, just process the event loop for some iterations and then resize to minimum.

It's like :

for i in range(0, 10):
      QApplication.processEvents()

self.resize(minimumSizeHint())

Another option is to single shot a QTimer which calls a slot in which you resize the window to minimum. This way when you resize the window, the minimum size hint is computed correctly.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...