Adjust mainwindow size when sub widget is hidden
-
Hi, there, I'm writing a qt program and trying to resize mainwindow when sub widget is hidden, but there's some difference in Linux and Windows, and I don't know the property way to adjust size in both. Here's my minimum code:
// MainWindow MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainlayout = new QVBoxLayout(mainWidget); QPushButton *hide = new QPushButton(mainWidget); subwidget *sub = new subwidget(mainWidget); mainlayout->addWidget(hide); mainlayout->addWidget(sub); connect(hide, &QPushButton::clicked, sub, &subwidget::onHide); setCentralWidget(mainWidget); adjustSize(); connect(hide, &QPushButton::clicked, this, [&] { QTimer::singleShot(0, this, [&] { adjustSize(); }); }); } // Widget subwidget::subwidget(QWidget *parent) : QWidget{parent} { QVBoxLayout *vlayout = new QVBoxLayout(this); QPushButton *btn1 = new QPushButton(); btn2 = new QPushButton(); vlayout->addWidget(btn1); vlayout->addWidget(btn2); } void subwidget::onHide() { btn2->hide(); }
When I set the timer interval to 1, mainwindow will be the adjusted size when btn2 is hidden in Linux, but it doesn't work in Windows. How can I adjust the mainwindow in windows?
PS: I have tried to add a signal when subwidget is hidden and connect it to
adjustSize
likeconnect(sub, &subwidget::hidden, this, [&] { adjustSize(); });
, but it also doesn't work. -
On MacOS, adjustSize has no effect until mainwidow is shown.
void MainWindow::show() { QMainWindow::show(); adjustSize(); }
[EDIT] I end up with this:
class subwidget : public QFrame { public: subwidget(QWidget *parent): QFrame{parent} { setFrameShape(QFrame::Box); QVBoxLayout *vlayout = new QVBoxLayout(this); QPushButton *btn1 = new QPushButton(); btn2 = new QPushButton(); vlayout->addWidget(btn1); vlayout->addWidget(btn2); } void onHide() { btn2->setVisible(!btn2->isVisible()); adjustSize(); } QPushButton* btn2; }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainlayout = new QVBoxLayout(mainWidget); QPushButton *hide = new QPushButton(mainWidget); hide->setFixedSize(200,200); subwidget *sub = new subwidget(mainWidget); mainlayout->addWidget(hide); mainlayout->addWidget(sub); mainlayout->addStretch(0); connect(hide, &QPushButton::clicked, sub, &subwidget::onHide); setCentralWidget(mainWidget); connect(hide, &QPushButton::clicked, this, [this] { // update the layout this->centralWidget()->layout()->update(); this->centralWidget()->layout()->activate(); this->adjustSize(); }); } void MainWindow::show() { QMainWindow::show(); adjustSize(); }
Seems to work...
Unfortunately, i can't test on Windows. -
Hi,
What about adjusting your subwidget object as well ?
-
On MacOS, adjustSize has no effect until mainwidow is shown.
void MainWindow::show() { QMainWindow::show(); adjustSize(); }
[EDIT] I end up with this:
class subwidget : public QFrame { public: subwidget(QWidget *parent): QFrame{parent} { setFrameShape(QFrame::Box); QVBoxLayout *vlayout = new QVBoxLayout(this); QPushButton *btn1 = new QPushButton(); btn2 = new QPushButton(); vlayout->addWidget(btn1); vlayout->addWidget(btn2); } void onHide() { btn2->setVisible(!btn2->isVisible()); adjustSize(); } QPushButton* btn2; }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainlayout = new QVBoxLayout(mainWidget); QPushButton *hide = new QPushButton(mainWidget); hide->setFixedSize(200,200); subwidget *sub = new subwidget(mainWidget); mainlayout->addWidget(hide); mainlayout->addWidget(sub); mainlayout->addStretch(0); connect(hide, &QPushButton::clicked, sub, &subwidget::onHide); setCentralWidget(mainWidget); connect(hide, &QPushButton::clicked, this, [this] { // update the layout this->centralWidget()->layout()->update(); this->centralWidget()->layout()->activate(); this->adjustSize(); }); } void MainWindow::show() { QMainWindow::show(); adjustSize(); }
Seems to work...
Unfortunately, i can't test on Windows.