Qt:showMaximized() 在 Windows 中不起作用

Posted

技术标签:

【中文标题】Qt:showMaximized() 在 Windows 中不起作用【英文标题】:Qt: showMaximized() not working in Windows 【发布时间】:2014-11-26 19:25:21 【问题描述】:

我通过双击在我的应用程序(Windows)中打开一个文件。我将通过参数收到的文件名传递给我的打开逻辑。我正在调用 showMaximized(),但它没有被接收。打开的窗口没有最大化,默认位于屏幕的左上角。

请注意,所有这些逻辑流程都是通过 ma​​in() 进行的,因此 showMaximized() 可能在事件循环开始之前被调用。这是否会阻止 showMaximized() 正常工作?如果是,如何解决?

我也尝试使用 QTimer::singleShot(0,...,...) (以便让事件循环开始)但这甚至停止了非最大化屏幕。

PS:在 Mac 中,屏幕会通过事件 (QEvent::FileOpen) 进行最大化

【问题讨论】:

您能否提供一个演示问题的最小代码示例? 【参考方案1】:

最简单的解决方法是在使用 showMaximized() 之前使用 resize(800,600)。我在 Windows 8.1 上的 Qt 5.7.0 中有类似的错误。

【讨论】:

先生,您真是个天才。您的技巧还解决了我在 UHD 显示器中的错误 showMaximized() 呼叫。【参考方案2】:

进程第一次调用 ShowWindow 时,会忽略 show 命令并使用 STARTUPINFO 结构中提供的命令(应与 WinMain 中的 nCmdShow 参数相对应)。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx

这种令人惊讶的行为倾向于在您所描述的问题中表现出来。如果您不想直接使用任何 Win32 API 调用,您可以通过简单地发出 QT 的 showMaximized 调用两次来解决它。

【讨论】:

尝试调用 showMaximized 两次,但仍然是相同的行为。【参考方案3】:

我的回答迟了,但我写它以防它对某人有帮助。

我正在使用 PyQt 6 在 Windows 11 上试验同样的问题。

最初我使用Vasilyev Eugene提出的解决方案,但在某些情况下会失败。

我发现的最佳解决方案是使用延迟 1000 毫秒的 sigleShot:

QtCore.QTimer.singleShot(1000, self.showMaximized)

最终用户几乎察觉不到时间,您可以尝试使用较低的值,显然 0 除外。

此解决方案适用于 PyQt,但也适用于 Qt。

【讨论】:

以上是关于Qt:showMaximized() 在 Windows 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我用 QT4.7 调用了 showMaximized(),出现了一个奇怪的问题

QT布局问题,求去掉边框做法

Qt主窗体显示最前

Qt - 拖动标题栏时防止窗口调整大小

QT编程可以用sys/socket.h这个头文件吗,怎么我的QT5找不到这个头文件,我的是wind

QMainWindow::showMaximized() 不更新大小