可能的 Qt5 错误:调用 setFixedSize() 会禁用主窗口的关闭按钮(在 Win7 下)
Posted
技术标签:
【中文标题】可能的 Qt5 错误:调用 setFixedSize() 会禁用主窗口的关闭按钮(在 Win7 下)【英文标题】:Possible Qt5 bug: calling setFixedSize() disables the main window's close button (under Win7) 【发布时间】:2020-01-14 08:21:22 【问题描述】:我发布这个主要是因为我浪费了一些时间来摸索解决方案,也是出于好奇。
根据流行的要求,一步一步的可重现示例:
从 Qt 设计器创建一个 Qt 小部件项目。 将所有选项保留为默认值,项目名称除外(我叫我的“bob”)。 将构建目标设置为 MinGW X64
使用默认的自动生成代码骨架编译并启动可执行文件(我在调试模式下完成了,但发布也不起作用)。 检查主窗口是否可调整大小,并且右上角的关闭按钮是否按预期工作。
打开文件“mainwindow.cpp”并像这样添加setFixedSize
调用:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
ui->setupUi(this);
setFixedSize(geometry().size()); // <--- this line added
MainWindow::~MainWindow()
delete ui;
重新编译、重新启动并检查窗口现在是否拒绝调整大小(应该如此),并且关闭按钮不再关闭窗口,但允许拖动它,就像您单击标题栏一样(它不应该)。
根据更受欢迎的要求,我认为上述详细指南的基本原理是该问题的可复制示例
最小:
检查
简洁易读:
检查
确保重现问题所需的所有信息 包含在问题本身中:
检查
为您包含的每个文件或 sn-p 使用单独的代码块。 为每个块的用途提供说明:
检查,除非你想让我在那里转储 Qt 小部件项目的所有默认文件。
描述问题:
完成,两次。
使用简短但描述性的问题摘要作为标题 你的问题:
检查
消除与问题无关的任何问题:
努力尝试,但显然收效甚微
仔细检查您的示例是否重现了问题:
检查,大量。
关闭系统并重新启动它可能会有所帮助,或者传输 以一个新鲜的环境为例,以确认它确实提供了一个 问题示例:
好吧,对不起,我不想重新格式化我的电脑,只是为了解决一个容易解决的老生常谈的问题。我发表这篇文章主要是出于好奇,以及对可能遇到同样问题的程序员的礼貌,我认为我现在已经做得足够了。
那么现在,对于问题的描述:
显然,在标准 Qt Widgets 应用程序的主窗口构造函数中调用 setFixedSize(geometry().size())
(如 this venerable Qt forums thread 所建议的那样)具有使我的 Windows 7 系统上的系统关闭按钮无效的奇怪副作用。
好像点击事件只是通过按钮,点击它只会抓住窗口并允许拖动它,但不会关闭它。 除此之外,一切都按预期工作(窗口变得无法调整大小,右下角的调整大小手柄处于非活动状态,您仍然可以通过其他标准方式(如 Alt+F4 等)关闭窗口。
一种使主窗口固定大小的有效方法(尽管是特定于平台的)是调用setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
在设置用户界面之前 (ui->setupUi(this);
)
我仍然对这种令人惊讶的行为感到好奇。 更改布局管理器的行为参数会弄乱系统按钮是否有明显的原因? 我在这里做错了吗? 这是一个可重现的错误,还是我 PC 上本地问题的奇怪后果 - 可能是错误的安装或配置?
我正在使用基于 Qt 5.14.0 的 Qt Creator 4.11.0,将 MinGW X64 作为(法国)Win7 操作系统上的目标(出于某种原因,处于测试模式,但我怀疑操作系统应该归咎于此)。
【问题讨论】:
我无法重现“错误”。它按预期工作,我仍然可以使用窗口的关闭按钮。但我在 Windows 10 下。也许还有其他东西会产生这种行为。 无法在 Windows 10 上使用 Qt 5.5 重现。在 ctor 中调用setFixedSize(this->geometry().size());
会禁用调整大小,但关闭按钮会按预期工作
我无法重现该问题。 Windows 7 x64、Qt 5.12 和 VS 2017。使用 Aero 和经典主题进行测试。抱歉,我没有安装 mingw。
这一次我按照你的例子照做了。对我来说仍然无法重现。这让我相信它在某种程度上与您的平台设置有关。使用 mingw 时可能会有一些奇怪的行为。你能用 Visual Studio 简单地运行它吗?
在 QML link987654322@中创建的窗口也会出现同样的问题
【参考方案1】:
根据官方错误跟踪器https://bugreports.qt.io 确实存在影响某些版本的错误(可能是 Qt 5.12.5 引入的回归)。
请看:
https://bugreports.qt.io/browse/QTBUG-79922
和
https://bugreports.qt.io/browse/QTBUG-78262
和
https://bugreports.qt.io/browse/QTBUG-78656
但是,他们报告该问题已在 Qt 5.14 中得到修复,并已向后移植到 Qt 5.13.2。
您正在使用使用 Qt 5.14 编译的 Qt Creator,但我不清楚您是否也在针对 Qt 5.14 或其他版本编译您的应用程序。用于编译 Qt Creator 的版本和您用于代码的工具包显然是两个不同的东西。因此,我建议检查您是否确实使用应该具有修复的版本来编译您的应用程序,如果是,请将问题报告给 bugreports.qt.io
由于是 Qt 的 bug,所以我们无能为力...
【讨论】:
我可以重现在 Windows 7 上运行经典主题的 Qt 5.12.6 和 MSVC 2017 x64 构建测试程序的错误。 Aero 主题不受影响。我之前的测试是使用 Qt 5.12.0,它也不受影响。 Qt 5.14.0 也可以。在我看来,SO 问题和答案对于错误修复可能非常有价值,这是软件开发不可或缺的一部分。公开开发的开源项目不应该害怕它。在这种情况下,最新的 Qt 版本的 bug 现在似乎已修复,但最新的 LTS 5.12.6 受到影响,并且还没有 5.12.7。 非常感谢。事实上,当我努力让它与 MSVC 2019 和最后一个 Win7 SDK 一起工作时,我可能搞砸了我的环境。我已经安装了几个连续版本的 Qt,但那里可能出了点问题。以上是关于可能的 Qt5 错误:调用 setFixedSize() 会禁用主窗口的关闭按钮(在 Win7 下)的主要内容,如果未能解决你的问题,请参考以下文章
QT5.11本来是正常的,安装VS2015(2017)后出现如下错误