`
feipigwang
  • 浏览: 746411 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何创建QML自定义元素?

 
阅读更多


有时Qt中Declarativ模块提供元素不够用,这时我们可以根据自己需要创建自定义的元素。下面的例子
我们自己创建了一个Line的自定义元素。
qmlapp.pro
  1. QT+= core gui declarative

  2. TARGET = qmlapp
  3. TEMPLATE = app

  4. SOURCES += main.cpp
  5. HEADERS+= line.h
  6. OTHER_FILES += ui.qml
复制代码
新的元素需要继承自QDeclarativeItem,通过Q_PROPERTY我们可以为新的元素定义新的属性,
NOTIFY是用来通知绑定到这个属性的其他属性更新值。

line.h
  1. #ifndef LINE_H
  2. #define LINE_H

  3. #include <QDeclarativeItem>
  4. #include <QPainter>

  5. class Line : public QDeclarativeItem
  6. {
  7. Q_OBJECT
  8. Q_PROPERTY(int x1 READ x1 WRITE setX1 NOTIFY x1Changed);
  9. Q_PROPERTY(int y1 READ y1 WRITE setY1 NOTIFY y1Changed);
  10. Q_PROPERTY(int x2 READ x2 WRITE setX2 NOTIFY x2Changed);
  11. Q_PROPERTY(int y2 READ y2 WRITE setY2 NOTIFY y2Changed);
  12. Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged);
  13. Q_PROPERTY(int penWidth READ penWidth WRITE setPenWidth NOTIFY penWidthChanged);

  14. public:
  15. Line(QDeclarativeItem *parent = 0) :
  16. QDeclarativeItem(parent), m_x1(0), m_y1(0), m_x2(0), m_y2(0),
  17. m_color(Qt::black), m_penWidth(1)
  18. {
  19. // Important, otherwise the paint method is never called
  20. setFlag(QGraphicsItem::ItemHasNoContents, false);
  21. }

  22. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  23. {
  24. QPen pen(m_color, m_penWidth);
  25. painter->setPen(pen);

  26. if(smooth() == true) {
  27. painter->setRenderHint(QPainter::Antialiasing, true);
  28. }

  29. int x = qMin(m_x1, m_x2) - m_penWidth/2;
  30. int y = qMin(m_y1, m_y2) - m_penWidth/2;

  31. painter->drawLine(m_x1 - x, m_y1 - y, m_x2 - x, m_y2 - y);
  32. }

  33. // Get methods
  34. int x1() const { return m_x1; }
  35. int y1() const { return m_y1; }
  36. int x2() const { return m_x2; }
  37. int y2() const { return m_y2; }
  38. QColor color() const { return m_color; }
  39. int penWidth() const { return m_penWidth; }

  40. // Set methods
  41. void setX1(int x1) {
  42. if(m_x1 == x1) return;
  43. m_x1 = x1;
  44. updateSize();
  45. emit x1Changed();
  46. update();
  47. }

  48. void setY1(int y1) {
  49. if(m_y1 == y1) return;
  50. m_y1 = y1;
  51. updateSize();
  52. emit y1Changed();
  53. update();
  54. }

  55. void setX2(int x2) {
  56. if(m_x2 == x2) return;
  57. m_x2 = x2;
  58. updateSize();
  59. emit x2Changed();
  60. update();
  61. }

  62. void setY2(int y2) {
  63. if(m_y2 == y2) return;
  64. m_y2 = y2;
  65. updateSize();
  66. emit x2Changed();
  67. update();
  68. }

  69. void setColor(const QColor &color) {
  70. if(m_color == color) return;
  71. m_color = color;
  72. emit colorChanged();
  73. update();
  74. }

  75. void setPenWidth(int newWidth) {
  76. if(m_penWidth == newWidth) return;
  77. m_penWidth = newWidth;
  78. updateSize();
  79. emit penWidthChanged();
  80. update();
  81. }

  82. signals:
  83. void x1Changed();
  84. void y1Changed();
  85. void x2Changed();
  86. void y2Changed();
  87. void colorChanged();
  88. void penWidthChanged();

  89. protected:
  90. void updateSize() {
  91. setX(qMin(m_x1, m_x2) - m_penWidth/2);
  92. setY(qMin(m_y1, m_y2) - m_penWidth/2);
  93. setWidth(qAbs(m_x2 - m_x1) + m_penWidth);
  94. setHeight(qAbs(m_y2 - m_y1) + m_penWidth);
  95. }

  96. protected:
  97. int m_x1;
  98. int m_y1;
  99. int m_x2;
  100. int m_y2;
  101. QColor m_color;
  102. int m_penWidth;
  103. };

  104. QML_DECLARE_TYPE(Line)

  105. #endif // LINE_H
复制代码
在main函数中,我们向QML系统中的版本号为1.0的自定义组件库CustomComponents中注册一个名为Line的QML元素。
main.cpp
  1. #include "line.h"
  2. #include <QApplication>
  3. #include <QDeclarativeView>

  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);

  7. qmlRegisterType<Line>("CustomComponents", 1, 0, "Line");

  8. QDeclarativeViewview;
  9. view.setSource(QUrl("./ui.qml"));
  10. view.setResizeMode(QDeclarativeView::SizeRootObjectToView);

  11. #if defined(Q_WS_S60) || defined(Q_WS_MAEMO)
  12. view.showMaximized();
  13. #else
  14. view.setGeometry(100,100, 800, 480);
  15. view.show();
  16. #endif
  17. return a.exec();
  18. }
复制代码
在需要用到Line元素的QML文件中,我们需要导入1.0版本的CustomComponents库,这里面将包含我们的自定义元素Line
  1. ui.qml
  2. import CustomComponents 1.0
  3. import Qt 4.7

  4. Rectangle {
  5. property bool evenClick : false

  6. anchors.fill: parent; color: "lightsteelblue"

  7. Line {
  8. id: diagonalLine

  9. anchors.fill: parent

  10. Behavior on x1 { NumberAnimation { duration: 1000 } }
  11. Behavior on y1 { NumberAnimation { duration: 1000 } }
  12. Behavior on x2 { NumberAnimation { duration: 1000 } }
  13. Behavior on y2 { NumberAnimation { duration: 1000 } }

  14. x1: parent.x + 20; y1: parent.height / 2
  15. x2: parent.width - 20; y2: parent.height / 2
  16. color: "tomato"; penWidth: 3; smooth: true
  17. }

  18. MouseArea {
  19. anchors.fill: parent
  20. onClicked: {
  21. if(evenClick) { diagonalLine.x1 = mouseX; diagonalLine.y1 = mouseY }
  22. else { diagonalLine.x2 = mouseX; diagonalLine.y2 = mouseY }
  23. evenClick = !evenClick
  24. }
  25. }

  26. Text {
  27. id: textX1Y1
  28. anchors.left: parent.left; anchors.top: parent.top
  29. text: "x1: " + diagonalLine.x1 + " y1: " + diagonalLine.y1
  30. }

  31. Text {
  32. anchors.left: parent.left; anchors.top: textX1Y1.bottom; anchors.topMargin: 10
  33. text: "x2: " + diagonalLine.x2 + " y2: " + diagonalLine.y2
  34. }
  35. }
分享到:
评论

相关推荐

    QML自定义组件(基于qt5.6ming的)

    ML 可以由这些基本元素组合成一个复杂的元素,方便以后...QML 提供了很多方法来创建组件。不过,本章我们只介绍一种方式:基于文件的组件。基于文件的组件将 QML 元素放置在一个单独的文件中,然后给这个文件一个名字。

    Qml之自编表格控件(动态)

    笔者在使用qt的qml语言开发产品时候,经常需要用到一些表格类的控件,...这一表格控件采用最基本qml元素编写,兼容性非常好,该表格控件还支持qt接口调用,动态显示。在文章的最后会公开源代码,仅供读者们参考学习。

    QML小程序:输入元素

    展示自定义组件(行编辑框)的输入,焦点切换 展示自定义组件(文本编辑框)的输入

    福优林@Qt5小白变大牛初级篇word---第11章.pdf

    QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。 Qt QML模块为QML语言开发应用程序和库提供了一个框架。 它定义并...

    Qt Quick之Canvas(画布),适合Qt初学者

    在Qt Quick中,Canvas是一个重要的元素,它提供了一个二维绘图API,允许开发人员在QML(Qt Modeling Language)中创建自定义的图形。QML-Canvas俗称画布,它用来定义一个绘图区域,可以使用ECMAScript代码来绘制直线...

    QT学习之路2 (1~82篇)

    详细目录 1. 序 2. Qt 简介 3. Hello, world!...78. QML 基本元素 79. QML 组件 80. 定位器 81. 元素布局 82. 输入元素 其他文章 宏定义中的 do {…} while (0) C++:在堆上创建对象,还是在栈上?

    基于Qt编写的音乐播放器,界面由QML编写,网络和文件由C++实现,能够搜索和播放在线歌曲。.zip

    Qt Quick Controls和Qt Quick Dialogs提供了一系列预定义的QML组件,用于构建具有传统桌面风格或现代移动风格的界面元素。同时,Qt Quick也支持自定义控件开发。 多媒体支持: Qt Multimedia模块提供对音频、...

    Qt Quick核心编程

    着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、...

    QtQuick实现的涂鸦板

    基于Qt Quick(QML)实现的画图示例,演示如何在C++中自定义Qt Quick元素,如何处理鼠标事件。

    qt quick 核心编程源码

    着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、...

    Qt Quick核心编程.安晓辉(带详细书签) PDF

    着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、...

    Qt Quick核心编程(清晰版)

    着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、...

    QT核心编程技术

    本书起始于基础的开发环境搭建和qt快速介绍,帮助读者正确使用开发环境,着力于QML语言基础,事件qtquick 基本元素,qml与C++混合编程Canvas,定制以及自定义控件等高级主题,本书提供了精彩的示例,内容适用于桌面...

    基于Qt的不围棋(nogo)单机对战平台,包含基于MCTS的AI对战Bot.zip

    Qt Quick Controls和Qt Quick Dialogs提供了一系列预定义的QML组件,用于构建具有传统桌面风格或现代移动风格的界面元素。同时,Qt Quick也支持自定义控件开发。 多媒体支持: Qt Multimedia模块提供对音频、...

    基于Qt的P2P聊天软件实现,主要由多个聊天客户端和一个中心注册服务器组成。.zip

    Qt Quick Controls和Qt Quick Dialogs提供了一系列预定义的QML组件,用于构建具有传统桌面风格或现代移动风格的界面元素。同时,Qt Quick也支持自定义控件开发。 多媒体支持: Qt Multimedia模块提供对音频、...

    基于Qt QGraphicsView的简易画图软件.zip

    Qt Quick Controls和Qt Quick Dialogs提供了一系列预定义的QML组件,用于构建具有传统桌面风格或现代移动风格的界面元素。同时,Qt Quick也支持自定义控件开发。 多媒体支持: Qt Multimedia模块提供对音频、...

Global site tag (gtag.js) - Google Analytics