3

[qt 4.8]

为了获得正确的窗口尺寸,包括其框架,我执行以下操作(如此处所述,请参阅 Daniel Hedberg评论)。

mainWindow.move(-50000, -50000);
mainWindow.show();

// do something with the window dimensions

mainWindow.move(0, 0);
mainWindow.show()

这工作正常,但是,我的调用有一个问题move(0,0):它使窗口始终出现在位置 (0,0),而我希望具有默认行为,即,应用程序仅向窗口管理器建议(0,0) 是放置窗口的好地方,WM 可能会决定在必要时移动它以避免重叠。换句话说,我想切换回 Qt 的默认行为,就好像根本没有调用一样move

我怎样才能做到这一点?

4

2 回答 2

0

查看 Qt 的源代码,我现在可以部分回答我自己的问题:要将调用转换move为定位建议而不是请求,请执行以下操作:

mainWindow.move(100, 100);
mainWindow.setAttribute(Qt::WA_Moved, false);
mainWindow.show();

我已经使用 Qt 4.8.4 在 X11 下测试了代码,希望它也适用于其他平台。

不幸的是,这并不能解决我遇到的问题,即用于show获取屏幕外窗口的(装饰)尺寸,然后将其移动到屏幕上,show再次调用。似乎第一次调用show直接设置特定于平台的窗口管理器标志,这些标志在第二次调用中没有完全重置和重新评估。实际上,我会认为这是 Qt 中的一个错误,所以我会相应地报告它。

于 2013-11-11T09:51:47.990 回答
0

一种解决方案是存储 Windows 原始位置并使用它。为了更加安全(以防屏幕分辨率发生变化),请检查整个窗口是否仍然适合屏幕,如果不适合则移动甚至调整大小。

一个 hacky 的替代方法是创建并打开相同大小的空的、可能是透明的虚拟窗口,然后查看它的位置。然后将原件移到那里并关闭虚拟的。仔细阅读您的问题,我认为这会满足您的需求。

我不知道要求窗口管理器重新定位窗口的 Qt 方式,所以如果你真的需要,请指定操作系统等详细信息。

于 2013-10-22T20:09:29.587 回答