Qt 重新显示最大化QWidget

Qt 重新显示最大化QWidget,qt,qt5,Qt,Qt5,我在运行Qt应用程序时遇到了一个问题。考虑下面的代码片段。 #include <QApplication> #include <QLabel> #include <QPushButton> #include <QVBoxLayout> #include <QWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget ma

我在运行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();
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QWidget主窗口;
主窗口。设置最小宽度(400);
mainWindow.setWindowTitle(“主窗口”);
QVBoxLayout*layout1=新的QVBoxLayout(&main窗口);
QPushButton*按钮=新的QPushButton(“点击打开辅助窗口”);
布局1->addWidget(按钮);
QWidget*auxWindow=新的QWidget(&mainWindow,Qt::Window);
auxWindow->setMinimumWidth(400);
auxWindow->setWindowTitle(“辅助窗口”);
QVBoxLayout*layout2=新的QVBoxLayout(auxWindow);
QLabel*label=新的QLabel(“这是辅助窗口”);
布局2->addWidget(标签);
QObject::connect(按钮、&QPushButton::单击、auxWindow、&QWidget::显示);
mainWindow.show();
返回a.exec();
}
此代码创建一个窗口(主窗口),其中有一个按钮。单击此按钮时,将显示另一个窗口(辅助窗口)。如果用户以前关闭过aux窗口,按下主窗口的按钮将导致aux窗口重新打开

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

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

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

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

我知道如果我想让aux窗口重新最大化打开,我可以使用
QWidget::showMaximized()
,但是,同样,我需要aux窗口恢复其以前的最大化状态,它并不总是最大化的

那么,正确的方法是什么来正确地绘制最大化的重新显示窗口


我在Windows 10上使用的是Qt 5.9.3。

这是一个Qt错误,解决方法是通过延迟命令强制重新显示窗口。窗口具有正确的状态,但可以说布局没有得到消息

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);
  }
};
classmywidget:publicqwidget{
Q_对象
使用self=MyWidget;
使用base_class=QWidget;
//...
受保护的:
无效显示事件(QShowEvent*ev)覆盖{
QTimer::singleShot(0,this,[this]{

qDebug()在我的情况下,如果我关闭了最大化辅助窗口,但没有打开最大化,那么该代码是否再现了您的问题?是的,它确实再现了我的问题。可能是Windows 10上的Qt 5.9.3错误行为?我将在其他平台上尝试。当我关闭最大化辅助窗口,并按下按钮时,此辅助窗口以其最小大小打开,我我在Linux中使用Qt 5.10.1。您使用QSettings吗?在Qt5.10上,与@eyllanescQt 5.9.0/win10相同,它显示最小化。不幸的是,这不起作用:(我将尝试在5.9.5上测试它setup@LuisABOL请参见编辑:几何输出的外观如何?当我第一次打开aux窗口时,几何输出为QRect(640287 400x42),这是正确的。但当我在最大化并关闭aux窗口后重新打开该窗口时,几何体输出为QRect(0,29 400x42)。该窗口已最大化,但内容不适合该窗口,因为几何体的宽度和高度未被更新。如果
setAttribute(Qt::WA_Resized,true),是否有帮助
在调用
updateGeometry()
之前?还有@KubaOber您是否有与此问题相关的Qt错误报告的链接?非常感谢。