当前位置:   article > 正文

Qt Quick 常用元素:TabView(选项卡) 与 Slider(滑块)_qml tabview

qml tabview

1、TabView

TabView 可以实现类似 Windows 任务管理器的界面,有人叫 TabView 为标签控件,有人又称之为选项卡控件,我们知道它就是这么个东西就行了。现在来介绍 TabView 的属性和方法。

  • count 属性是只读的,返回 TabView 内的标签页的个数。
  • currentlndex 属性代表当前标签页的索引,从 0 开始,可以读取也可以设置它来切换标签。
  • frameVisible 指示标签页对应的内容周围的边框是否可见。tabVisible 设置标签栏是否可见。
  • tabPosition 保存标签栏的位置,默认是 Qt.TopEdge,在界面顶部;置 tabPosition 为 Qt.BottomEdge,标签栏就会跑到界面底部。
  • addTab (title, component) 方法用于增加一个标签,第一个参数是标签的标题,第二个参数是一个组件,代表标签对应的可视控件。insertTab (index, title, component)在指定索引位置插入一个标签。
  • removeTab (index) 删除指定位置的标签。moveTab(from, to) 将一个标签从索引 from 移动到索引。getTab (index) 返回指定位置的标签对象(类型为Tab),Tab 对象只有一个 title 属性,是 Loader 的派生类。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

1.1、标签控件简单示例

tabview_simple.qml 的内容如下:

  1. import QtQuick 2.2
  2. import QtQuick.Controls 1.2
  3. Rectangle {
  4. width: 360;
  5. height: 240;
  6. color: "lightgray";
  7. Component {
  8. id: tabContent;
  9. Rectangle {
  10. implicitWidth: 100;
  11. implicitHeight: 100;
  12. anchors.fill: parent;
  13. color: Qt.rgba(Math.random(), Math.random(), Math.random());
  14. }
  15. }
  16. Button {
  17. id: addTab;
  18. x: 8;
  19. y: 8;
  20. width: 60;
  21. height: 25;
  22. text: "AddTab";
  23. onClicked: {
  24. tabView.addTab("tab-" + tabView.count, tabContent);
  25. }
  26. }
  27. TabView {
  28. id: tabView;
  29. anchors.top: addTab.bottom;
  30. anchors.margins: 8;
  31. anchors.left: parent.left;
  32. anchors.right: parent.right;
  33. anchors.bottom: parent.bottom;
  34. }
  35. }

执行后,点击四次 "AddTab" 按钮后,再选择 "tab-1" 后的效果图如下所示。

 

太丑了点儿,对吧。没关系,咱们可以用 TabViewStyle 来定制。

1.2、使用 TabViewStyle

TabView 有 style 这个属性,可以为其指定一个 TabViewStyle 对象来定制 TabView。tabBar 绘制标签栏的背景。tab 绘制一个个的标签。frame 绘制 TabView 的边框。一般我们设置这三个属性即可打造一个美丽动人的 TabView。

下面看一个示例:

  1. import QtQuick 2.2
  2. import QtQuick.Controls 1.2
  3. import QtQuick.Controls.Styles 1.2
  4. import QtQuick.Layouts 1.1
  5. Rectangle {
  6. width: 360;
  7. height: 240;
  8. color: "lightgray";
  9. id: root;
  10. property var icons: ["call1.png", "call2.png", "call3.png"];
  11. Component.onCompleted: {
  12. tabView.addTab("ABC", tabContent);
  13. tabView.addTab("ZXY", tabContent);
  14. tabView.addTab("MQF", tabContent);
  15. tabView.addTab("WKJ", tabContent);
  16. }
  17. Component {
  18. id: tabContent;
  19. Rectangle {
  20. implicitWidth: 100;
  21. implicitHeight: 100;
  22. anchors.fill: parent;
  23. color: Qt.rgba(Math.random(), Math.random(), Math.random());
  24. }
  25. }
  26. TabView {
  27. id: tabView;
  28. anchors.fill: parent;
  29. style: TabViewStyle {
  30. tab: Item{
  31. implicitWidth: Math.max(text.width + 8, 80);
  32. implicitHeight: 48;
  33. Rectangle {
  34. width: (styleData.index < control.count - 1) ? (parent.width - 2) : parent.width;
  35. height: parent.height - 4;
  36. anchors.top: parent.top;
  37. anchors.left: parent.left;
  38. anchors.leftMargin: 1;
  39. visible: styleData.selected;
  40. gradient: Gradient {
  41. GradientStop{position: 0.0; color: "#606060";}
  42. GradientStop{position: 0.5; color: "#c0c0c0";}
  43. GradientStop{position: 1.0; color: "#a0a0a0";}
  44. }
  45. }
  46. Rectangle {
  47. width: 2;
  48. height: parent.height - 4;
  49. anchors.top: parent.top;
  50. anchors.right: parent.right;
  51. visible: styleData.index < control.count - 1;
  52. gradient: Gradient {
  53. GradientStop{position: 0.0; color: "#404040";}
  54. GradientStop{position: 0.5; color: "#707070";}
  55. GradientStop{position: 1.0; color: "#404040";}
  56. }
  57. }
  58. RowLayout {
  59. implicitWidth: Math.max(text.width, 72);
  60. height: 48;
  61. anchors.centerIn: parent;
  62. z: 1;
  63. Image{
  64. width: 48;
  65. height: 48;
  66. source: root.icons[styleData.index%3];
  67. }
  68. Text {
  69. id: text;
  70. text: styleData.title;
  71. color: styleData.selected ? "blue" : (styleData.hovered ? "green" : "white");
  72. }
  73. }
  74. }
  75. tabBar: Rectangle {
  76. height: 56;
  77. gradient: Gradient {
  78. GradientStop{position: 0.0; color: "#484848";}
  79. GradientStop{position: 0.3; color: "#787878";}
  80. GradientStop{position: 1.0; color: "#a0a0a0";}
  81. }
  82. Rectangle {
  83. width: parent.width;
  84. height: 4;
  85. anchors.bottom: parent.bottom;
  86. border.width: 2;
  87. border.color: "#c7c7c7";
  88. }
  89. }
  90. }
  91. }
  92. }

执行后的效果图如下所示:

 

TabViewStyle 对象的 tab 组件相对复杂一些,我设计为 “图标+文本” 的样式,图标在左, 文本在右。当选中标签时,使用 Rectangle 高亮背景。选中标签(styleData.selected为true)的文本,颜色为蓝色;未选中标签的文本,鼠标悬停(styleData.hovered为true)时为绿色,否则为白色。

2、Slider

Slider 类代表一个水平或垂直的滑块控件,通常用于让用户在某个取值范围内选择一个值。先来看一个示意图,见下图。

滑块组件分为面板(panel)、滑槽(groove)、刻度线(tickmarks)和滑块(handle)四部分。而 Slider 对应的用来定制滑块控件外观的 SliderStyle 类,恰恰就有 groove、handle、 panel、tickmarks 四个组件。也就是说,滑块控件的每个组成部分,都可以定制。不过,我们一般只定制 handle 和 groove,其他两个定制起来稍微麻烦一些。

  • maximumValue 用来设置最大值,默认值为 1.0。minimumValue 用来设置最小值,默认值为0。value 代表滑块控件的当前值,默认值为 0,使用 onValueChanged 信号处理器可以跟踪滑块当前值的变化。
  • stepSize 用来设置滑块变化的步长,当你使用方向键调整滑块时,按一次它就增加或减少 stepSize 设定的值。
  • orientation 属性用来设置控件的方向,可以是水平的(Qt.Horizontal)或垂直的 (Qt. Vertical)。
  • updateValueWhileDragging 属性用来设置拖动滑块时控件的当前值是否变化,默认为 true。
  • tickmarksEnabled 属性指示是否显示刻度线,默认为 false。
  • hovered 属性指示鼠标是否悬停在控件上方,pressed 指示鼠标或手指是否按下。这两个属性都是只读的。
  • activeFocusOnPress 属性指示当用户按下鼠标或手指时,控件是否获得键盘焦点,默认为 false。

现在隆重地介绍我们的重量级嘉宾:style。使用 style 属性,你就可以随心所欲地妆扮你的滑块控件了。一般,style 属性指向一个 SliderStyle 对象。

2.1 SliderStyle

SliderStyle 用来定制一个 Slider 的外观,你可以定制面板、滑槽、滑块、刻度线四部分。

  • control 属性指向应用此风格对象的滑块控件实例。
  • groove 属性指向滑槽组件,handle 指向滑块组件,tickmarks 指向刻度线组件,panel 指向面板组件,它们的类型都是 Component。

需要说明的是,一般我们只需要定制 groove 和 handle 就能够得到不错的效果。

2.2 滑块简单示例

好啦,现在我们提供一个滑块的示例,看看 Slider 的各个属性的用法。slider_demo.qml 代码如下:

  1. import QtQuick 2.2
  2. import QtQuick.Controls 1.2
  3. import QtQuick.Controls.Styles 1.2
  4. Rectangle {
  5. width: 320;
  6. height: 240;
  7. color: "lightgray";
  8. Row {
  9. anchors.fill: parent;
  10. spacing: 20;
  11. Column{
  12. width: 200;
  13. spacing: 16;
  14. Text {
  15. id: sliderStat;
  16. color: "blue";
  17. text: "current - 0.1";
  18. }
  19. Slider {
  20. width: 200;
  21. height: 30;
  22. stepSize: 0.01;
  23. value: 0.1;
  24. onValueChanged: {
  25. sliderStat.text = "current - " + value;
  26. }
  27. Component.onCompleted: console.log(activeFocusOnPress);
  28. }
  29. Slider {
  30. width: 200;
  31. height: 30;
  32. minimumValue: 0;
  33. maximumValue: 100;
  34. stepSize: 1;
  35. value: 50;
  36. tickmarksEnabled: true;
  37. }
  38. Slider {
  39. id: customGrooveAndHandle;
  40. width: 200;
  41. height: 30;
  42. stepSize: 0.1;
  43. value: 0;
  44. tickmarksEnabled: true;
  45. style: SliderStyle {
  46. groove: Rectangle {
  47. implicitWidth: 200;
  48. implicitHeight: 8;
  49. color: "gray";
  50. radius: 8;
  51. }
  52. handle: Rectangle {
  53. anchors.centerIn: parent;
  54. color: control.pressed ? "white" : "lightgray";
  55. border.color: "gray";
  56. border.width: 2;
  57. width: 34;
  58. height: 34;
  59. radius: 12;
  60. }
  61. }
  62. }
  63. Slider {
  64. id: customPanel;
  65. width: 200;
  66. height: 36;
  67. stepSize: 0.1;
  68. value: 0;
  69. tickmarksEnabled: true;
  70. style: SliderStyle {
  71. groove: Rectangle {
  72. implicitWidth: 200;
  73. implicitHeight: 8;
  74. color: "gray";
  75. radius: 8;
  76. }
  77. handle: Rectangle {
  78. anchors.centerIn: parent;
  79. color: control.pressed ? "white" : "lightgray";
  80. border.color: "gray";
  81. border.width: 2;
  82. width: 34;
  83. height: 34;
  84. radius: 12;
  85. Text {
  86. anchors.centerIn: parent;
  87. text: control.value;
  88. color: "red";
  89. }
  90. }
  91. panel: Rectangle {
  92. anchors.fill: parent;
  93. radius: 4;
  94. color: "lightsteelblue";
  95. Loader {
  96. id: grooveLoader;
  97. anchors.centerIn: parent;
  98. sourceComponent: groove;
  99. }
  100. Loader {
  101. id: handleLoader;
  102. anchors.verticalCenter: grooveLoader.verticalCenter;
  103. x: Math.min(grooveLoader.x + (control.value * grooveLoader.width) / (control.maximumValue - control.minimumValue), grooveLoader.width - item.width);
  104. sourceComponent: handle;
  105. }
  106. }
  107. }
  108. }
  109. }
  110. Slider {
  111. width: 30;
  112. height: 200;
  113. orientation: Qt.Vertical;
  114. stepSize: 0.1;
  115. value: 0.2;
  116. tickmarksEnabled: true;
  117. }
  118. }
  119. }

使用 qmlscene 加载 slider_demo.qml,效果如下图所示。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/806096
推荐阅读
相关标签
  

闽ICP备14008679号