qt:移动窗口离屏后,如何将其移回默认位置,包括默认定位行为?

时间:2013-10-21 09:49:05

标签: qt layout

[qt 4.8]

要获得正确的窗口尺寸,包括其框架,我会执行以下操作(如here所述,请参阅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

我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

一个hacky替代方案是创建并打开相同大小的空的,可能透明的虚拟窗口,并查看它的位置。然后移动原件并关闭假原件。仔细阅读你的问题,我认为这会做你想要的。

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

答案 1 :(得分:0)

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

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

我使用Qt 4.8.4测试了X11下的代码,希望它也可以在其他平台上使用。

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