我目前正在尝试在远程XServer(Exceed)上执行Qt X11应用程序。为了使应用程序窗口始终位于其他显示之上,我使用以下语句:
MainWindow->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Tool);
如果我在本地在Windows 7和Ubuntu操作系统上执行我的应用程序,它将作为“Always on Top”应用程序执行。但是,当我将显示信息路由到远程XServer(Exceed x64 v14)时,它开始执行而没有“Always on Top”属性。当它失去焦点时,它会落后于其他显示器。
我应该在Qt代码或Exceed产品中进行任何进一步的配置吗?
感谢。
答案 0 :(得分:2)
X11转发不支持此功能
答案 1 :(得分:1)
首先让我们一些术语。您设置的“Always on Top”属性不是X11的功能,而是标准的一组所谓的窗口管理器“Hints”的一部分,指定为Inter-Client-Communication-Manual和Extended-Window-Manager的一部分-Hints。
X11不处理窗口上的窗口放置,这就是Window管理器的作用。在典型的X11系统上,你有一个ICCCM / EWMH兼容的窗口管理器,它可以控制所有的窗口,一切都很好。这也适用于所有类型的转发,因为对于X11服务器,客户端连接的方式无关紧要,客户端之间的所有通信都通过X11服务器进行。
现在,在您的情况下,您正在使用Exceed,它是在Microsoft Windows桌面上运行的X11服务器。 Windows会自行完成所有窗口管理,而“永远在线”是Windows的窗口管理代码的一部分。但是,由于X11没有定义策略,但只有方法将任何类型的ICCCM / EWMH信息永远传递给Windows窗口管理。所有Windows都是由Exceed为各个客户创建的无特色顶级窗口。
现在你可以在Exceed中启动一个X11 WM,但是这个WM只存在于X11内,并且因为X11没有定义像“Always-On-Top”这样的策略无法告诉Windows,窗口应该实际上保持不变最佳。您也可以在“全屏”模式下启动Exceed,它会打开一个完整的窗口,其中所有X11客户端都在自己的小桌面上运行。其中运行的WM只管理其中的X11客户端,但再次无法将其信息传递给Windows。
您实际需要的是某种Bypass,它将并行连接到Exceed,并与X11端的ICCCM / EWMH保持Windows窗口属性(策略)的同步。这样的程序是完全可行的,但我不知道有任何可用的程序。