经过几个月的尝试、搜索、审查代码等,我无法找到在 QT 中正确定位新窗口的解决方案。在我最基本的情况下,我只想获取窗口的最终大小并将其置于鼠标下方居中。它将被移动以确保窗口的任何部分都不在屏幕之外。我不希望窗口出现然后移动到位,这会产生视觉冲击,尤其是在打开桌面 FX 的情况下。
我遇到的问题,并非所有问题都有适当的解决方案:
在窗口显示之前,frameGeometry 并不总是被填充。
有时,frameGeometry 是完全错误的,特别是在 Windows 7 上。
在显示之前,不可能知道是否会应用 sizeHint 或 size,或者介于两者之间的其他内容。也就是说,规模政策似乎不可预测。
请注意,我知道如何保存/恢复先前创建的窗口的几何形状。尽管 QT 这里也有缺陷,但我有一个可行的解决方案。
另请注意,我无法使用窗口管理器的默认位置。对于多显示器设置上的非 MDI 应用程序,它们的位置很糟糕(通常甚至不与鼠标位于同一显示器上)。
我还想避免仅仅为了实现解决方案而对所有小部件和对话框进行子类化,因为它不是通用的。如果这是唯一可能的方法,那么我愿意考虑它(如果事件过滤器也不是一个选项)。
有人有好的可行的解决方案吗?
Edited为了看起来更科学:我已将任意数量的调用更改为processEvents
使用一个检查返回值的循环。
再次编辑:看来新版本并不安全:它可能会陷入循环。所以我对迭代次数设置了限制。
原来的:
告诉我怎么回事儿。如果允许我引用我自己的代码:
// BIG PAIN: We want to get the dialog box to caluclate its own size. But there is
// no simple way to do this. The following seems to work, but only if processEvents
// is called at least twice. God knows why:
setAttribute (Qt::WA_DontShowOnScreen, true) ; // Prevent screen flicker
show() ;
QEventLoop EventLoop (this) ;
for (int i = 0 ; i < 10 ; i++)
if (!EventLoop.processEvents()) break ;
hide() ;
setAttribute (Qt::WA_DontShowOnScreen, false) ;
int x = 99 ; // whatever
int y = 99 ; // whatever
// Make sure it fits on the screen
QRect ScreenRect = qApp -> desktop() -> availableGeometry (ApplicationData -> mainWindow) ;
if (x + frameGeometry().width() > ScreenRect.right())
x = ScreenRect.right() - frameGeometry().width() ;
if (x < ScreenRect.x()) x = ScreenRect.x() ;
if (y + frameGeometry().height() > ScreenRect.bottom())
y = ScreenRect.bottom() - frameGeometry().height() ;
if (y < ScreenRect.y()) y = ScreenRect.y() ;
move (x, y) ;
尝试这个,通过不同数量的调用processEvents
。 (在这些调用中,各种子小部件和子子小部件递归地调整自身大小。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)