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.

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).

Note: I also tried invoking update() on various objects -- no luck there.

Can anyone provide some insight into what's going on and/or what I'm doing wrong?

Environment: Python 2.6.5; QtCore.qVersion() == 4.5.3

Many thanks,
John


#-------------------------
import PyQt4.QtCore as C
import PyQt4.QtGui as G

class MainWin(G.QMainWindow):
    def __init__(self, parent=None):
        super(MainWin, self).__init__(parent)
        self.setCentralWidget(G.QFrame(self))
        self.ctrlpanel = CtrlPanel(self)
        self.centralWidget().setLayout(G.QVBoxLayout())
        self.centralWidget().layout().addWidget(self.ctrlpanel)

        self.workpanel = None

    def fix_size(self):
        """change window size after removing work panel"""
        self.resize(*self.ctrlpanel.smallsize)

    def create_work_panel(self):
        self.workpanel = G.QFrame()
        self.workpanel.setStyleSheet("background-color: cyan")
        self.workpanel.setFixedSize(self.ctrlpanel.width(), 500)
        self.workpanel.show()

        # insert new work panel into layout, above control panel
        self.centralWidget().layout().insertWidget(0, self.workpanel)

class CtrlPanel(G.QFrame):
    def __init__(self, parent):
        super(CtrlPanel, self).__init__()
        self.mainwin = parent
        self.smallsize = None

        loadbtn = G.QPushButton("Create work panel")
        loadbtn.setFixedWidth(400)
        loadbtn.clicked.connect(self.create_cmd)

        resetbtn = G.QPushButton("Remove work panel")
        resetbtn.clicked.connect(self.remove_cmd)

        self.setLayout(G.QHBoxLayout())
        self.layout().addWidget(loadbtn)
        self.layout().addWidget(resetbtn)

    def create_cmd(self):
        """create work panel"""
        if self.mainwin.workpanel:
            return

        # save dimensions, for restoration by remove_cmd()
        if not self.smallsize:
            self.smallsize = (self.width(), self.height())

        self.mainwin.create_work_panel()

    def remove_cmd(self):
        """remove work panel"""
        if not self.mainwin.workpanel:
            return

        if not self.smallsize:
            self.smallsize = (self.width(), self.height())

        # find important objects in main window's QFrame
        for obj in self.mainwin.centralWidget().children():
            if isinstance(obj, G.QLayout):
                layout = obj
            elif isinstance(obj, G.QFrame):
                workpanel = obj

        layout.removeWidget(workpanel)
        workpanel.deleteLater()
        self.mainwin.workpanel = None

        # restore original window height -- set CHOICE to 0, 1, or 2
        CHOICE = 0

        if CHOICE == 0:
            # DOES NOT WORK: allow main window to resize automatically
            pass
        elif CHOICE == 1:
            # DOES NOT WORK: resize main window immediately
            self.mainwin.fix_size()

        elif CHOICE == 2:
            # WORKS: resize main window after pause
            self.fixit = C.QTimer(self)
            self.fixit.setInterval(50)
            self.fixit.setSingleShot(True)
            self.fixit.timeout.connect(self.mainwin.fix_size)
            self.fixit.start()

# main program
app = G.QApplication([])
vcalc = MainWin()
vcalc.show()
app.exec_()
#-------------------------
_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to