<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
Le 23/06/10 21:37, John Posner a &eacute;crit&nbsp;:
<blockquote cite="mid:4C22626E.7020306@optimum.net" type="cite">In the
program below, the main window's central widget is a QFrame that
*always* contains a control panel (CtrlPanel, subclass of QFrame).
Pressing the "Create work panel" button inserts another QFrame above
the CtrlPanel, causing the main window to grow vertically. Pressing the
"Remove work panel" button removes the work panel, which *should* cause
the main window to shrink vertically to its original size.
  <br>
  <br>
But the main window does not shrink automatically (using CHOICE = 0 in
line 74). Method MainWin.fix_size() should force the main window to
shrink, but simply invoking this method after removing the work panel
(CHOICE = 1) does not have the desired effect. The only thing that
works for me is using a QTimer to invoke MainWin.fix_size() after a
short delay (CHOICE = 2).
  <br>
  <br>
Note: I also tried invoking update() on various objects -- no luck
there.
  <br>
  <br>
Can anyone provide some insight into what's going on and/or what I'm
doing wrong?
  <br>
  <br>
Environment: Python 2.6.5; QtCore.qVersion() == 4.5.3
  <br>
  <br>
Many thanks,
  <br>
John
  <br>
  <br>
  <br>
#-------------------------
  <br>
import PyQt4.QtCore as C
  <br>
import PyQt4.QtGui as G
  <br>
  <br>
class MainWin(G.QMainWindow):
  <br>
&nbsp;&nbsp;&nbsp; def __init__(self, parent=None):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(MainWin, self).__init__(parent)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setCentralWidget(G.QFrame(self))
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ctrlpanel = CtrlPanel(self)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.centralWidget().setLayout(G.QVBoxLayout())
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.centralWidget().layout().addWidget(self.ctrlpanel)
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.workpanel = None
  <br>
  <br>
&nbsp;&nbsp;&nbsp; def fix_size(self):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """change window size after removing work panel"""
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.resize(*self.ctrlpanel.smallsize)
  <br>
  <br>
&nbsp;&nbsp;&nbsp; def create_work_panel(self):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.workpanel = G.QFrame()
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.workpanel.setStyleSheet("background-color: cyan")
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.workpanel.setFixedSize(self.ctrlpanel.width(), 500)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.workpanel.show()
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # insert new work panel into layout, above control panel
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.centralWidget().layout().insertWidget(0, self.workpanel)
  <br>
  <br>
class CtrlPanel(G.QFrame):
  <br>
&nbsp;&nbsp;&nbsp; def __init__(self, parent):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(CtrlPanel, self).__init__()
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mainwin = parent
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.smallsize = None
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbtn = G.QPushButton("Create work panel")
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbtn.setFixedWidth(400)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbtn.clicked.connect(self.create_cmd)
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resetbtn = G.QPushButton("Remove work panel")
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resetbtn.clicked.connect(self.remove_cmd)
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setLayout(G.QHBoxLayout())
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.layout().addWidget(loadbtn)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.layout().addWidget(resetbtn)
  <br>
  <br>
&nbsp;&nbsp;&nbsp; def create_cmd(self):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """create work panel"""
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.mainwin.workpanel:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # save dimensions, for restoration by remove_cmd()
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not self.smallsize:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.smallsize = (self.width(), self.height())
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mainwin.create_work_panel()
  <br>
  <br>
&nbsp;&nbsp;&nbsp; def remove_cmd(self):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """remove work panel"""
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not self.mainwin.workpanel:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not self.smallsize:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.smallsize = (self.width(), self.height())
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # find important objects in main window's QFrame
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for obj in self.mainwin.centralWidget().children():
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(obj, G.QLayout):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout = obj
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(obj, G.QFrame):
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; workpanel = obj
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.removeWidget(workpanel)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; workpanel.deleteLater()
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mainwin.workpanel = None
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # restore original window height -- set CHOICE to 0, 1, or 2
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHOICE = 0
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if CHOICE == 0:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # DOES NOT WORK: allow main window to resize automatically
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif CHOICE == 1:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # DOES NOT WORK: resize main window immediately
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mainwin.fix_size()
  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif CHOICE == 2:
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # WORKS: resize main window after pause
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fixit = C.QTimer(self)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fixit.setInterval(50)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fixit.setSingleShot(True)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fixit.timeout.connect(self.mainwin.fix_size)
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fixit.start()
  <br>
  <br>
# main program
  <br>
app = G.QApplication([])
  <br>
vcalc = MainWin()
  <br>
vcalc.show()
  <br>
app.exec_()
  <br>
#-------------------------
  <br>
_______________________________________________
  <br>
PyQt mailing list&nbsp;&nbsp;&nbsp; <a class="moz-txt-link-abbreviated" href="mailto:PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a>
  <br>
<a class="moz-txt-link-freetext" href="http://www.riverbankcomputing.com/mailman/listinfo/pyqt">http://www.riverbankcomputing.com/mailman/listinfo/pyqt</a>
  <br>
  <br>
</blockquote>
Hi,<br>
<br>
Change this def :<br>
<br>
&nbsp;&nbsp;&nbsp; def fix_size(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """change window size after removing work panel"""<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ctrlpanel.resize(*self.ctrlpanel.smallsize)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.QCoreApplication.processEvents()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.resize(*self.ctrlpanel.smallsize)<br>
<br>
and :<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif CHOICE == 1:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # DOES NOT WORK: resize main window immediately<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.QCoreApplication.processEvents()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mainwin.fix_size()<br>
<br>
use CHOICE = 1<br>
<div class="moz-signature">-- <br>
Vincent V.V.<br>
<a href="https://launchpad.net/oqapy">Oqapy</a></div>
</body>
</html>