重新展示最大化的QWidget

时间:2018-03-04 16:47:23

标签: qt qt5

我在运行Qt应用程序时遇到问题。请考虑以下代码段。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;
    mainWindow.setMinimumWidth(400);
    mainWindow.setWindowTitle("Main window");
    QVBoxLayout *layout1 = new QVBoxLayout(&mainWindow);
    QPushButton *pushButton = new QPushButton("Click to open aux window");
    layout1->addWidget(pushButton);

    QWidget *auxWindow = new QWidget(&mainWindow, Qt::Window);
    auxWindow->setMinimumWidth(400);
    auxWindow->setWindowTitle("Aux window");
    QVBoxLayout *layout2 = new QVBoxLayout(auxWindow);
    QLabel *label = new QLabel("This is aux window");
    layout2->addWidget(label);

    QObject::connect(pushButton, &QPushButton::clicked, auxWindow, &QWidget::show);

    mainWindow.show();

    return a.exec();
}

此代码创建一个窗口(主窗口),其中有一个按钮。单击此按钮时,会显示另一个窗口(辅助窗口)。如果用户之前关闭了辅助窗口,按下主窗口的按钮会导致辅助窗口重新打开。

我需要辅助窗口重新打开它在关闭之前的最大化状态,似乎Qt会自动执行,因此如果用户关闭窗口最大化,它将被重新显示最大化。

问题是当最大化时,辅助窗口未正确绘制。 Aux窗口以正确的最大化大小重新打开,但其内容显示为具有默认的未最大化大小。

Aux窗口在第一次关闭之前最大化。

Aux窗口在第一次关闭后最大化并重新显示。

我知道如果我希望辅助窗口重新打开最大化,我可以使用QWidget::showMaximized(),但是,我需要辅助窗口来恢复其先前的最大化状态,这并不总是最大化。

那么,正确绘制最大化的reshown窗口的正确方法是什么?

我在Windows 10上使用Qt 5.9.3。

1 个答案:

答案 0 :(得分:2)

这是一个Qt错误,解决方法是通过延迟 QWidget::updateGeometry强制重新启动窗口。窗口具有正确的状态,但布局不会得到消息,可以这么说。

class MyWidget : public QWidget {
  Q_OBJECT
  using self = MyWidget;
  using base_class = QWidget;
  //...
protected:
  void showEvent(QShowEvent *ev) override {
    QTimer::singleShot(0, this, [this]{
      qDebug() << geometry();
      updateGeometry();
    });
    base_class::showEvent(ev);
  }
};