1

我目前正在尝试在远程 XServer (Exceed) 上执行 Qt X11 应用程序。为了使应用程序窗口始终位于其他显示器之上,我使用以下语句:

MainWindow->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Tool);

如果我在本地 Windows 7 和 Ubuntu 操作系统上执行我的应用程序,它会作为“始终在顶部”应用程序执行。但是,当我将显示信息路由到远程 XServer(超过 x64 v14)时,它开始执行而没有“始终位于顶部”属性。当它失去焦点时,它落后于其他显示器。

我应该在 Qt 代码或 Exceed 产品中进行任何进一步的配置吗?

谢谢。

4

2 回答 2

2

X11 转发不支持此功能

于 2012-06-01T12:05:02.397 回答
1

首先让我们了解一些术语。您设置的“始终位于顶部”属性不是 X11 的功能,而是所谓的窗口管理器“提示”标准集的一部分,指定为客户端间通信手册和扩展窗口管理器的一部分- 提示。

X11 不处理窗口在屏幕上的位置,这就是窗口管理器所做的。在典型的 X11 系统上,您有一个 ICCCM/EWMH 兼容的窗口管理器,它控制着所有的窗口,一切都很好。这也适用于各种转发,因为对于 X11 服务器,客户端连接的方式无关紧要,客户端之间的所有通信都通过 X11 服务器进行。

现在,在您的情况下,您使用的是 Exceed,它是运行在 Microsoft Windows 桌面之上的 X11 服务器。Windows 自己完成所有的窗口管理,像“Always-On-Top”这样的东西是 Windows 窗口管理代码的策略部分。然而,由于 X11 没有定义策略,只有方法任何类型的 ICCCM/EWMH 信息永远不会传递给 Windows 窗口管理。所有 Windows 看到的都是 Exceed 为各个客户端创建的无功能的顶级窗口。

现在你可以在 Exceed 中启动一个 X11 WM,但是这个 WM 只存在于 X11 中,并且由于 X11 没有定义像“Always-On-Top”这样的策略,因此无法告诉 Windows,一个窗口实际上应该保持在顶部。您也可以在“全屏”模式下启动 Exceed,它会打开一个完整的窗口,其中所有 X11 客户端都在他们自己的小桌面上运行。在其中运行的 WM 只会管理其中的 X11 客户端,但同样不能将其信息传递给 Windows。

您实际需要的是某种旁路,它将并行连接到 Exceed,并使 Windows 窗口属性(策略)与 X11 端的 ICCCM/EWMH 保持同步。这样的程序是完全可行的,但我不知道有任何程序可以这样做。

于 2012-06-05T10:50:24.513 回答