用qml画坐标
来源:互联网 发布:单片机和微处理器功能 编辑:程序博客网 时间:2024/06/03 20:12
最近在做一个关于坐标的界面,
花了两天用qml画出来了,这里贴出来分享一下;
c++类OrdinateItem;
ordinateItem.h文件
#ifndef ORDINATEITEMS_H#define ORDINATEITEMS_H#include <QQuickItem>namespace UtAbCapb {class OrdinateItem : public QQuickItem//这里必须继承QQuickItem,因为要用到它的很多属性{ Q_OBJECT Q_PROPERTY(int scaleViewPostion READ scaleViewPostion WRITE setScaleViewPostion NOTIFY scaleViewPostionChanged) Q_PROPERTY(int lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged) Q_PROPERTY(QString lineColor READ lineColor WRITE setLineColor NOTIFY lineColorChanged) Q_PROPERTY(int rulerTotal READ rulerTotal WRITE setRulerTotal NOTIFY rulerTotalChanged) enum scaleVP{ RightVP=0, LeftVP };public: OrdinateItem();//构造private: void init();//初始化public: int scaleViewPostion(); // 刻度显示位置(0:默认左边,1:右边) void setScaleViewPostion(int vp); //设置刻度显示位置 int lineWidth(); // 画线线宽(默认3) void setLineWidth(int width); //设置线宽 QString lineColor(); // 画线颜色 void setLineColor(QString color); //设置画线颜色 int rulerTotal(); // 总刻度数(默认4) void setRulerTotal(int count); //设置刻度数 QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);//更新节点signals: void scaleViewPostionChanged(); //刻度显示位置变化信号 void lineWidthChanged(); //线宽变化 void lineColorChanged(); //线颜色变化 void rulerTotalChanged(); //刻度总是变化 void rulerUnitChanged(); //刻度初始位置信号public slots:private: int m_scale_vp; // 刻度显示位置 int m_line_width; // 线宽 QString m_line_color; // 线颜色 int m_ruler_count; // 刻度大小};}#endif // ORDINATEITEMS_H
ordinateItem.cpp文件
#include "ordinateitem.h"#include <QSGGeometryNode>#include <QSGFlatColorMaterial>#include <QDebug>namespace UtAbCapb {OrdinateItem::OrdinateItem(){ setFlag(ItemHasContents, true);//设置标识 this->init();}void OrdinateItem::init()//初始化刻度,线宽,颜色等{ m_scale_vp = LeftVP; m_line_width = 1; m_line_color = "#C5AD63"; m_ruler_count = 35;//纵坐标刻度35}int OrdinateItem::scaleViewPostion(){ return m_scale_vp;}void OrdinateItem::setScaleViewPostion(int vp){ m_scale_vp = vp;}int OrdinateItem::lineWidth(){ return m_line_width;}void OrdinateItem::setLineWidth(int width){ m_line_width = width;}QString OrdinateItem::lineColor(){ return m_line_color;}void OrdinateItem::setLineColor(QString color){ m_line_color = color;}int OrdinateItem::rulerTotal(){ return m_ruler_count;}void OrdinateItem::setRulerTotal(int count){ if(count>=10 && count<120){ m_ruler_count = count; update(); }}QSGNode *OrdinateItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *){ float max_x = (width()>30)? 20 : width();//定义获取宽度,这里获取的是qml中设定的宽度 float max_y = height();//获取高度因为继承了QQuickItem float rulerUnit = (max_y-10)/m_ruler_count;//卡尺比例 float scal_h = max_x;//毫米刻度, float scal_m = max_x*0.8;//分米刻度 float scal_l = max_x*0.5;//厘米刻度 int totalCount = m_ruler_count*2 + 4;//刻度总数 QSGGeometryNode *node = 0;//定义node,用于场景图中的所有渲染内容 node = static_cast<QSGGeometryNode *>(oldNode); QSGGeometry *geometry;//定义geometry,为图形提供低级存储 QSGFlatColorMaterial *material;//定义material,提供了一种在场景图中绘制纯色几何图形的方法 if(!node) { node = new QSGGeometryNode; geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), totalCount);//默认2d绘图。创建一个没有几何和材质的新的几何节点 geometry->setDrawingMode(GL_LINES);//绘图模式,GL画线 geometry->setLineWidth(m_line_width);//设置线宽 material = new QSGFlatColorMaterial;//实例 material->setColor(QColor(m_line_color));//设置颜色 node->setGeometry(geometry);//将geometry添加到node node->setFlag(QSGNode::OwnsGeometry);// node->setMaterial(material);//将此几何节点的材质设置为material } else { geometry = node->geometry(); material = static_cast<QSGFlatColorMaterial *>(node->material()); geometry->allocate(totalCount); } //定义vertices,获取的是geometry,2D的顶点数据指针 QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D(); int max = (m_scale_vp == LeftVP)? max_x : 0;//显示的位置 vertices[0].set(max, 0);//画直线从0开始画到max_y vertices[1].set(max, max_y);//根据的是屏幕分辨率高度 float x0=0; float y0=max_y; float x; float y; int cout =1; for(int i=0;i<=m_ruler_count;i++){ int itype = (i%5==0 && i%10==0)? 0 :((i%5==0 && i%10!=0)? 1 : 2); //0:max,1:mid,2:min switch (itype) { case 0: x0 = 0; x = scal_h; y = y0; break; case 1: x0 = (m_scale_vp == LeftVP)? scal_h*0.2 : 0; x = (m_scale_vp == LeftVP)? scal_h : scal_m; y = y0; break; case 2: x0 = (m_scale_vp == LeftVP)? scal_l : 0; x = (m_scale_vp == LeftVP)? scal_h : scal_l; y = y0; break; default: break; } vertices[++cout].set(x0, y0);//画线起始点 vertices[++cout].set(x, y);//终止点 y0 = y0 - rulerUnit; } node->markDirty(QSGNode::DirtyGeometry); return node;}}
在主函数main中:
qmlRegisterType<OrdinateItem>("OrdinateItem.com",1,0,"OrdinateItem");//注册到qml中
在qml中引用:
import OrdinateItem.com1.0
然后可以用了;
OrdinateItem{ id: ordId; width: 20; height: parent.height*0.4; rulerTotal: 35; anchors.bottom: horId.top; //scaleViewPostion: 1 MouseArea{ anchors.fill: parent; property point clickPos: "0,0" onPressed: { clickPos = Qt.point(mouse.x,mouse.y); } onPositionChanged: { //鼠标偏移量 var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y) coordId.x = coordId.x+delta.x; coordId.y = coordId.y+delta.y; } } }
0 0
- 用qml画坐标
- qml 画的问题
- 用QML创建 QQuickWindow
- qml
- QML
- QML
- qml
- QML
- QML
- qml
- QML
- QML
- 用QML开发MeeGo应用程序
- 用QML开发Android APP
- 【初学qml之麻烦篇】:(1)依据坐标,判断某处的Item
- 用 Mathematica 画极坐标曲线
- 设置光标坐标请用设备坐标
- qt qml c++ 画动态折线图
- [leetcode]167. Two Sum II
- Tomcat报错error listenerstart解决办法
- asp.net请求限制
- asp.net中的onclientclick和onclick
- c#内存清理
- 用qml画坐标
- seq2seq 训练时 feed 自己的数据
- PHP学习笔记4:变量
- ifconfig
- 利用python的matplotlib绘制分布图
- 运维不仅仅是Linux,居然还要知道这么多?(2017-05-11 永福 运维帮)
- 爱国者冯军:BAT做大是因为大数据做得好
- Incorrect datetime value
- nginx拉黑过多访问的IP(忘记参考自哪里,抱歉)