【问题标题】:Why wayland and xorg appearance of Qt6 are different?为什么 Qt6 的 wayland 和 xorg 外观不同?
【发布时间】:2022-01-07 09:46:17
【问题描述】:

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

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

为了更容易,我使用了 Qt python 绑定,并且我尝试了不同的组合,因为我的第一个组合以某种方式失败了。 我必须做出的选择是:

  • PyQtPySide
    • 我更喜欢第二种,因为它是一种官方支持(而且它们相当)
  • Qt5Qt6
    • 我更喜欢第二个,因为它是最新的稳定版

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

  • Qt5 窗口在 XOrg 和 Wayland 上看起来一样
  • Qt6 窗口不行,不管我用哪个python包(PyQt or PySide

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

这里有几个截图作为一个简单的例子:

  • Qt6 (PySide6) 在 Wayland 上

  • XOrg 上的Qt6 (PySide6)

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

【问题讨论】:

    标签: wayland pyside6 qt6


    【解决方案1】:

    首先,虽然针对相同的“结果”(为最终用户显示和交互),但 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 相比,仅在一年前发布,并且仍在进行深入开发:一些功能在几个月前已经[重新]引入并进行了根本性的更改,它仍然每天收到数十个错误报告。 p>

    确实不过,Qt 一年前提出了questionable move,决定将 Qt5 分支的未来错误修复版本限制为仅针对商业许可证持有者,这引起了一些严重的担忧,因为 Qt6 尚未发布没有像 Qt5 那样稳定或功能齐全(虽然已经取得了重要进展,但仍然不是)。一个free fork exists的提案,但还没有发生任何事情。

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

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

    【讨论】:

    • 感谢您的详细回答,它为我的问题添加了上下文,但它没有回答它:我对 XOrg 和 Wayland 之类的细节很草率,但它的描述性足以让您理解找出我感兴趣的东西。我知道“系统主题”在 Linux DE 中确实是一个相对概念,但是 Qt5 或 Xorg 在使用 Gtk 风格方面做得很好(当然我在 GNOME 上......)。特别是,我希望它也遵循 Ubuntu 主题,但替代主题是补丁本身,而不是 Gtk 功能,所以我不指望它。
    • 此外:在你回答的最后一部分,你假设了我没有在我的问题中提出的事情。 “最后一个稳定”是指“稳定”版本中的最后一个版本。一般来说,我更喜欢使用 last stable,因为它们通常会取代以前的稳定版并获得更多的开发工作量。这是个人的选择,关于 Qt5 的支持我还没有说什么。然后在“官方”PySide上:总的来说PyQt和PySide是相当的,我问了一个不同的问题,没有做彻底比较的目的。我选择了一个,它对我有用,这就是我需要的一切。
    • @Annibale 我同时更新了问题,我不知道您是否阅读了更改的部分:更新的部分与这些方面部分相关:Qt6 引入了主要的核心更改(其中许多与到平台插件和 Wayland),它们仍在积极开发和更改中。如果您的目标是更好的集成,现在我建议您多坚持使用 Qt5。 (为了完整起见,我只添加了 PyQt/PySide 段落)
    • 我同意 Qt6 看起来相当不稳定(与 Wayland 相关),但获取文档更容易doc.qt.io/qtforpython 并且它只能在未来改进。根据我的经验,我可以告诉 Qt5 暂时可能是一个更容易的选择(在我的情况下涉及 Linux),但我希望 Qt6 尽快好起来,因为作者大多放弃 5。
    • @Annibale 这不仅仅是关于 Wayland,还有其他问题(例如,新重新引入的 QtMultimedia 模块,它已终于重新设计,但现在显然需要一段时间才能达到稳定)。根据文档,在任何情况下通常最好依赖官方 C++ 文档(并最终检查 python 相关页面以防有疑问),因为它更好地帮助理解函数在 C++ 端的实际工作方式(研究源代码也是真的很有用)。我迟早也想切换到 Qt6,但现在弊大于利。
    猜你喜欢
    • 2012-09-18
    • 2022-11-22
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2011-08-29
    • 2019-08-13
    • 2011-05-01
    相关资源
    最近更新 更多