我在运行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窗口以正确的最大化大小重新打开,但其内容显示为具有默认的未最大化大小。
我知道如果我希望辅助窗口重新打开最大化,我可以使用QWidget::showMaximized()
,但是,我需要辅助窗口来恢复其先前的最大化状态,这并不总是最大化。
那么,正确绘制最大化的reshown窗口的正确方法是什么?
我在Windows 10上使用Qt 5.9.3。
答案 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);
}
};