为什么Qt6的wayland和xorg外观不一样?

Ann*_*ale 5 wayland qt6 pyside6

我正在尝试使用 Qt 制作一个非常简单的窗口。

我的目标是获得看起来像本机操作系统窗口的东西(以最少的努力),仅此而已,但如果可能的话也不会少。

为了使它更容易,我使用 Qt python 绑定,并且自从我的第一个组合失败后我尝试了不同的组合。我必须做出的选择是:

  • PyQt或者PySide
    • 我更喜欢第二个,因为它是唯一的官方支持(而且它们非常等效)
  • Qt5或者Qt6
    • 我更喜欢第二个,因为它是最新的稳定版

现在,正如之前所说,我尝试了不同的组合,但第一个选择似乎无关紧要,而第二个选择很重要:

  • Qt5窗口在 XOrg 和 Wayland 上看起来相同
  • Qt6窗口不,无论我使用哪个Python包(PyQtPySide

特别Qt6是在 Wayland 上,它会覆盖默认的操作系统样式,包括指针(即指针在窗口悬停时发生变化Qt6),并且它不会在 XOrg 上发生,也不会发生Qt5(在 Wayland 上和 XOrg 上具有相同的外观)。

这是一个简单示例的几个屏幕截图:

  • Qt6( PySide6) 位于韦兰

qt6-wayland

  • Qt6PySide6XOrg 上的( )

据了解,这两个窗口是由相同的脚本生成的......

qt6-xorg

mus*_*nte 2

首先,虽然目标是相同的“结果”(为最终用户显示和交互),但 Xorg 和 Wayland 有很大不同:第一个是服务器,第二个是协议。

虽然已经积极开发了近十年,但 Wayland 进入主流使用是最近的事(与已经使用了 30 多年的 X 不同),这意味着它仍然需要时间才能达到“透明比较”。

“主题化”不仅仅是移植的问题,因为 UI 的外观取决于这两个系统之间非常不同的方面。例如,在 X 上,客户端使用系统鼠标光标(除非被覆盖),而在 Wayland 上,光标必须由客户端设置(通常是工具包,本例中为 Qt)。

Qt 在交叉兼容性支持方面付出了如此巨大的努力,依赖于过多的系统挂钩(平台插件),这些系统挂钩并不容易处理,特别是在具有无限可能配置的 Linux 环境中。这两者之间的外观不同是预期的(至少现在是这样),并且可能是由于多个方面造成的,其中许多方面取决于窗口环境、安装的主题和发行版的定制。如果您使用自定义存储库,以及安装的 Qt 和 wayland 版本,这可能有助于了解您正在使用的 Linux 版本。

考虑到所有这些,特别是在 Linux 上,不存在“本机窗口”这样的东西。有一个与当前窗口环境兼容的外观,但是有很多方面可能会干扰它,包括操作系统本身,有时 Qt 可以用它做很少的事情,特别是如果操作系统不太关心的话关于其他工具包或使用特定的定制(请参阅 Ubuntu/Gtk 和该发行版的各种版本)。

由于 Qt6 的一些核心方面经历了深刻的变化(包括 Wayland 支持),可能需要更多的时间才能达到 Qt5 目前的相同水平的兼容性,这也取决于相关的 FOSS 社区将如何反应与此同时。目前,除非您确实需要仅适用于 Qt6 的方面,否则如果您仍在开始使用 Qt 进行学习和开发,我建议您坚持使用 Qt5 一段时间:它仍然被广泛使用并支持一般应用程序。用法,这意味着您将更容易地找到帮助和资源,而使用 Qt6,当问题实际上是由 Qt 引起时,仍然存在怀疑的余地,它特定于某个版本或某些操作系统/平台方面(就像它可能在您的系统中一样)案件)。
每当您想要切换到 Qt6 时,过渡将几乎是透明的,并且通常比 Qt4 和 Qt5 之间的过渡更容易,只有少数需要更多关注的重要更改(例如,QAction 已移至 QtGui 模块) 。


最后,关于您对 Qt 及其绑定的考虑的一些注释。

Qt6是最新的稳定版

这是一个部分错误的假设:“稳定”并不意味着“最新”或“最好”。最近发布的稳定主要版本这一事实并不意味着先前主要版本的最新稳定版本“不太”稳定。
Qt5 已经开发并广泛使用了近十年(许多核心功能在 Qt4 多年前就已开发并“稳定”),这意味着它非常稳定,特别是与一年前发布的 Qt6 相比,并且仍在经历深入的开发:一些功能在几个月前才被[重新]引入并发生了根本性的改变,并且每天仍然收到数十个错误报告。

不过,确实,Qt 一年前做出了一个值得怀疑的举动,决定限制 Qt5 分支未来的错误修复版本仅针对商业许可持有者,这引起了一些严重的担忧,因为 Qt6 还不如Qt5稳定或功能齐全(并且,虽然已经取得了重要进展,但仍然没有)。存在免费分叉的提案,但尚未发生任何事情。

也就是说,Qt5.15稳定的,如果您遇到仅在商业版本中修复的问题,那么您很可能无论如何都可以轻松解决它。

关于 PyQt/PySide 的差异,虽然 PySide 确实是“官方”支持的 python 绑定,但这并不是您在比较它们时应该考虑的唯一方面。除了许可证方面之外,这两个绑定的工作方式及其支持/功能也存在一些差异:例如,PyQt 添加了对一些更多 Python 方面的支持,并且值得注意的是uic.loadUiQUiLoader 无法以任何方式提供的功能。