wayland 环境下 Qt 类程序的父子窗口定位问题 #5033
-
看到 deepin V23 引入了 wayland 环境,我们这些 Qt 开发者也当早做打算,但是发现一个普遍性的问题,Qt 的消息弹窗,对话框弹窗,甚至所有子窗口弹出都是据根父级窗口的位置计算的。而 wayland 不支持窗口间获取这些数据。 比如,随便写个弹窗,让它吐个坐标,在 wayland 下永远是 (0,0)
唯今之计,就是在启动脚本中指定一个临时变量,强指
这实际是调用 x11 的接口来运行了,终不是长久之计。而 Qt 认为这是 wayland 协议的缺陷(bug),并无修复计划。 看到 deepin 博客上写过,深度截图搞定了这问题。 所以,针对这个问题,Qt框架内,有无符规范性的解决办法? 如果 Qt 放任这个问题,而 wayland 依然故我(他们一直这样),未来 deepin 怎么处理 Qt 程序这个兼容性问题? 盼复。 |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 13 replies
-
wayland有wayland的方法,你要拿到其他窗口都要通过窗口管理器去拿,窗口各自是独立的。 如果你不是做窗口管理器绑定的软件,就没必要去探索其他窗口的位置了 |
Beta Was this translation helpful? Give feedback.
-
https://github.com/cppxiaozhu/Demo/blob/82511d03d854f2fee45088c4b04e2e6b2abced8b/mainwindow.cpp#L20 这是一个常规的,通用的写法 : 按下 button,弹个消息框,没有用到底层协议。 类似的操作,在应用程序中很常见。但是这个写法在 wayland 下是失效的,会窗口飘移。 |
Beta Was this translation helpful? Give feedback.
-
wayland 设计如此,就是故意不让你获取窗口位置的。其实有一些合成器是有拓展协议去支持获取和设置窗口位置的,但并非所有 wayland 合成器下都可用。 QMessageBox 应该是对应到 wayland 的 popup 类型窗口,一般合成器会把这种窗口摆到它的父窗口的中间。 如果你希望你的逻辑可移植的话,对于实现通知是使用通知的接口,实现无边框窗口移动的话 Qt 也提供了一个 (ps. 和你的问题无关:Qt 的 .user 文件是不需要 check in 到 VCS 里的) |
Beta Was this translation helpful? Give feedback.
更新,deepin上弹窗位置是中间,也没有问题,看来你只能去问gnome了
看了下demo, QMessageBox 这个本来就是在父窗口中间位置弹窗的,这个没有问题,不需要定位全局的坐标,这个例子如果失败那就是gnome的问题