为啥 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget

Posted

技术标签:

【中文标题】为啥 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget【英文标题】:Why RangeSlider is available in QtQuick and not as standard Widget为什么 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget 【发布时间】:2017-03-16 15:47:12 【问题描述】:

我需要一个范围滑块之类的东西(一个有两个用于设置最小值/最大值的手柄的滑块)。

我注意到 QtQuick 和 QML(无论是什么)中有一个 RangeSlider,但没有像 QRangeSlider 这样的“标准小部件”。

这是为什么?

我可以在不编写 QML 代码的情况下使用 QtQuick 中的 RangeSlider 吗?

【问题讨论】:

【参考方案1】:

在我的项目中,我成功使用了Common TK range slider。

看起来像这样:

实践课准备去这里:CPP和header

【讨论】:

这种风格是你定义的,还是操作系统的默认风格?或者更糟糕的是,这种风格是由那个小部件定义的吗? 这是从 Common TK 网站 (commontk.org/index.php/Documentation/ImageGallery) 截取的屏幕截图。它看起来像 Gnome 样式,但我认为您可以使用 Qt 样式表对其进行自定义 在我的应用程序中它看起来像这样(使用 Linux KDE):qlcplus.org/features/vcxypad.png。在任何情况下,样式都是依赖于操作系统的 我试过了,它实际上非常非常好!另外,我注意到你的项目有很多很棒的小部件。 Jave 你考虑过制作一个单独的小部件库吗? 不是真的没有。它们中的大多数都是为我的软件中的特定用途量身定制的。无论如何,它是开源的,所以抓住你想要/需要的任何东西【参考方案2】:

由于RangeSlider 是一个QML 类型,您需要QML 上下文才能在其中使用它。QQuickWidget 只是一个专门用于加载和显示QML 内容的QWidget。它只是它的另一个子类,这一事实使您能够将其集成到您选择的QWiget 中。有关如何集成这两者的示例,请参见 here(该示例使用 QMainWindow,但您可以根据需要对其进行调整。

我对标准 QWidget 中缺少的 UI 组件的猜测是:

开发人员可以通过调整QSlider (example) 轻松创建它 Qt 公司在新特性方面与 QWidget 相关的东西基本上已经死了,因为它们全速转向 QML。我不喜欢它,但事情就是这样 范围滑块不那么受欢迎。您可以轻松地将一个滑块(需要支持一个范围)替换为两个滑块(一个用于下限,一个用于上限)、两个 QSpinBoxes 等。

更好的解决方案是为此转储 QML 内容并在 C++ 中实现您自己的版本。

【讨论】:

QGraphicsScene 自 Qt 5 起不再用作 Qt Quick 的后端。 你是对的。我已经忘记了。但是您仍然可以使用QQuickWidgetQWidget 中加载 QML 内容,并在 QML 和 C++ 代码之间建立所需的连接。 这是个糟糕的主意! Creste 一个 qml 上下文以显示一个小部件!?你为什么不在它的时候加载webkit,或者启动一个python实例。 我从来没有说过“这样做。这是最好的解决方案”。恕我直言,解决方案(这也是公认的答案)是在 C++ 中实现滑块。 PS:RangeSlider 不是一个小部件,它是一个 QML 控件,因为我们很敏感。【参考方案3】:

因为 Qt Widgets 是一个“旧”库,Qt 开发人员,尤其是 Qt 公司,除了必要的错误修复之外,不使用它。

而 Qt Quick Controls(1 和 2)是较新的并且得到了所有的关注。

此外,Qt Quick 和 Qt Widgets 的内容之间没有联系,它们是完全不相关的库,即对一个库的更改或更新不会导致另一个库的更改或更新。

(这并不完全正确,因为 Qt Quick Controls 1 使用 Qt Widgets 来进行一些样式设置,但就公开可用的组件而言,这是成立的)

您通常不能混合使用 Qt Widget 和 Qt Quick 组件,它们以完全不同的方式呈现,Qt Widget 使用 QPainter 而 Qt Quick 使用 SceneGraph。但是您可以使用 QQuickWidget 在 Qt Widgets 应用程序中渲染 Qt Quick 场景,因此您可以制作一个 RangeSlider 小部件,在内部显示 Qt Quick RangeSlider。

【讨论】:

那么我该如何使用 QtQuick 中的这些小部件之一? @manatttta 我已经更新了我的答案,它应该能回答你的问题。 “因为 Qt Widgets 是一个“旧”库,Qt 开发人员,尤其是 Qt 公司,除了必要的错误修复之外,不使用它。”那是完全错误的,以及“您通常不能混合使用 Qt Widgets 和 Qt Quick 组件” @Gojir4 2012 年,~自 Qt 5 发布以来,Qt Widgets 被正式“标记为‘完成’,这意味着 [他们] 没有人积极致力于新功能”。来源:blog.qt.io/blog/2012/04/18/qt-5-c-and-qt-widgets 就在最近,在 Qt 2018 路线图中,Qt 公司提到围绕 Qt Widgets 的活动有所增加(这伴随着模块维护者的变化)。但他们仍然没有宣布任何新功能。相反,Qt Quick Controls 为每个 Qt 5 次要版本提供了一批新控件。所以现在请教我我的陈述是错误的。 @Gojir4 另外,如果您有任何混合 Qt 小部件和 Qt 快速项目的方法,就像仅混合小部件或仅混合项目一样容易,同时仅使用 Qt public 跨小部件/项目边界保持元素的正确呈现顺序API,请继续证明我错了。

以上是关于为啥 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget的主要内容,如果未能解决你的问题,请参考以下文章

在 rangeslider.js 中禁用某些范围

如何在 Flutter 中制作这个自定义 RangeSlider?

如何单独引用 RangeSlider 的每个拇指 (ControlsFX)

在 Shiny 中使用带有 ion.RangeSlider 滑块输入的日期

无法让 rangeslider.js 工作

新的 ion.RangeSlider 给 Shiny 带来了哪些优势?