【问题标题】:Reshowing maximized QWidget重新显示最大化的 QWidget
【发布时间】:2018-03-04 16:47:23
【问题描述】:

我在运行 Qt 应用程序时遇到了问题。考虑以下代码 sn-p。

#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 会自动执行此操作,因此如果用户关闭最大化的窗口,它会重新显示为最大化。

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

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

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

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

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

我在 Windows 10 上使用 Qt 5.9.3。

【问题讨论】:

  • 在我的情况下,如果我关闭最大化的辅助窗口没有打开最大化,该代码会重现您的问题吗?
  • 是的,它确实重现了我的问题。也许是 Windows 10 上的 Qt 5.9.3 不当行为?我会在其他平台上试试。
  • 当我关闭最大化的辅助窗口,并按下该辅助窗口以最小尺寸打开的按钮时,我在 Linux 中使用 Qt 5.10.1。你在使用 QSettings 吗?
  • 在 Qt5.10 上与 @eyllanesc 相同
  • Qt 5.9.0 / win10,一样,显示最小化了。

标签: qt qt5


【解决方案1】:

这是一个 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);
  }
};

【讨论】:

  • 那没用,不幸的是:(我会尝试在 5.9.5 设置上测试它
  • @LuisABOL 查看编辑:几何输出看起来如何?
  • 当我第一次打开辅助窗口时,几何输出是 QRect(640,287 400x42),这是正确的。但是当我在最大化并关闭辅助窗口后重新打开它时,几何输出为 QRect(0,29 400x42)。窗口已最大化,但内容不适合窗口,因为几何图形的宽度和高度未更新
  • 在拨打updateGeometry()之前先setAttribute(Qt::WA_Resized, true)有帮助吗?
  • 还有@KubaOber,您是否有与此问题相关的 Qt 错误报告的链接?非常感谢,谢谢。
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2019-08-07
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多