Qt由入门到放弃

您所在的位置:网站首页 qcustomplot绘制点 Qt由入门到放弃

Qt由入门到放弃

2023-01-04 03:45| 来源: 网络整理| 查看: 265

       Qt由入门到放弃-QCustomPlot绘制天气曲线图并动态显示曲线坐标值(二)

      由于项目需要,实现天气预报的曲线绘制功能,进而学习了QCustomPlot的第三方控件,这里浅尝辄止的分享一下自己对QCPAxisTicker坐标轴类的使用,先上图看QCPAxisTicker的几种用法:

一、QCPAxisTicker基类

QCPAxisTicker是坐标轴的基类,它的属性和方法如下,其中有刻度轴步长显示策略TickStepStrategy的枚举类型,可参考此篇文章QCustomplot使用分享(六) 坐标轴和网格线:

1class QCPAxisTicker 2{ 3 4public: 5 /*! 6 定义选择坐标轴步长策略 7 */ 8 enum TickStepStrategy 9 { 10 tssReadability //具有更好可读性的(由系统分配)刻度步长匹配优先于自定义分配刻度数目匹配 11 ,tssMeetTickCount //使用setTickCount()函数设置用户自定义的刻度数目 12 }; 13 // getters: 14 TickStepStrategy tickStepStrategy() const { return mTickStepStrategy; }//获得刻度匹配策略 15 int tickCount() const { return mTickCount; }//返回刻度数 16 double tickOrigin() const { return mTickOrigin; }//获得起点坐标偏移量 17 // setters: 18 void setTickStepStrategy(TickStepStrategy strategy);//设置刻度匹配策略 19 void setTickCount(int count);//设置刻度数目 20 void setTickOrigin(double origin);//设置起点坐标偏移量 21 // introduced virtual methods:虚函数自定义生成坐标刻度 22 virtua void generate(const QCPRange &range, const QLocale &locale, QChar formatChar, 23 int precision, QVector &ticks, QVector *subTicks, QVector *tickLabels); 24 25protected: 26 // property members: 27 TickStepStrategy mTickStepStrategy; 28 int mTickCount; 29 double mTickOrigin; 30 31 // introduced virtual methods: 32 virtual double getTickStep(const QCPRange &range);//获得轴范围内刻度间距 33 virtual int getSubTickCount(double tickStep);//一个大刻度间距中子刻度的数目 34 virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision);//获得刻度向量 35 virtual QVector createTickVector(double tickStep, const QCPRange &range);//生成刻度向量 36 virtual QVector createSubTickVector(int subTickCount, const QVector &ticks);//生成子刻度向量 37 //生成刻度标签向量 38 virtual QVector createLabelVector(const QVector &ticks, 39 const QLocale &locale, QChar formatChar, int precision); 40 41 // non-virtual methods: 42 //trimTicks()从指定范围之外的刻中移除刻度坐标,如果keepOneOutlier==true,则在保留的刻度范围两边保留刻度标记 43 void trimTicks(const QCPRange &range, QVector &ticks, bool keepOneOutlier) const; 44 //pickClosest()返回包含在与所提供的目标最接近的候选坐标,此方法假定候选者不是空的,按升序排序 45 double pickClosest(double target, const QVector &candidates) const; 46 //getMantissa()返回输入的十进制尾数,例如142.6的输入将返回尾数1.426和100的大小。 47 double getMantissa(double input, double *magnitude=0) const; 48 //cleanMantissa()返回一个接近输入的数字,它有一个更简单的人类可读尾数 49 double cleanMantissa(double input) const; 50}; 51 二、 QCPAxisTickerDateTime 1.QCPAxisTickerDateTime类是日期时间坐标轴

关于日期时间可看我前一篇Qt由入门到放弃-QDate、QTime、QDateTime的相关函数,具体方法如下所示:

1class QCPAxisTickerDateTime : public QCPAxisTicker 2{ 3public: 4 5 // getters: 6 QString dateTimeFormat();//获得日期显示格式 7 Qt::TimeSpec dateTimeSpec();//获得时区 8 9 // setters: 10 void setDateTimeFormat(const QString &format);//设置时间显示格式 11 void setDateTimeSpec(Qt::TimeSpec spec);//设置时区 12 void setTickOrigin(double origin); 13 void setTickOrigin(const QDateTime &origin); 14 15 // static methods: 16 static QDateTime keyToDateTime(double key);//时间戳转成日期 17 static double dateTimeToKey(const QDateTime dateTime);//日期转成时间戳秒 18 static double dateTimeToKey(const QDate date);//日期转成时间戳秒 19 20protected: 21 // property members: 22 QString mDateTimeFormat;//格式化时间 23 Qt::TimeSpec mDateTimeSpec;//时区 24 25 // non-property members: 26 enum DateStrategy //设置刻度策略 27 { 28 dsNone //刻度不设置间距,默认大于等于一秒 29 , dsUniformTimeInDay //刻度间距大于等于一天 30 , dsUniformDayInMonth //刻度间距大于等于一月 31 } mDateStrategy; 32 33 // reimplemented virtual methods: 34 virtual double getTickStep(const QCPRange &range); 35 virtual int getSubTickCount(double tickStep) ; 36 virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) ; 37 virtual QVector createTickVector(double tickStep, const QCPRange &range) ; 38}; 39 40 2.据此实现了一个小例子: 1void setupTestQCPAxisTickerDateTime() 2{ 3 customPlot->setInteraction(QCP::iRangeDrag, true); 4 customPlot->setInteraction(QCP::iRangeZoom, true); 5 QDateTime dateTime = QDateTime::currentDateTime(); 6 double now = dateTime.toTime_t();//当前时间转化为秒 7 //生成时间刻度对象 8 QSharedPointer dateTimeTicker(new QCPAxisTickerDateTime); 9 customPlot->xAxis->setTicker(dateTimeTicker); 10 //dateTimeTicker->setDateTimeSpec(Qt::UTC);//设施世界时间,即不加上时区的时间 11 dateTimeTicker->setTickCount(12); 12 dateTimeTicker->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount); 13 customPlot->xAxis->setSubTicks(false); 14 customPlot->xAxis->setRange(now, now+3600*24);//x轴范围,从当前时间起往后推24小时 15 QVector yData, xData;//生成数据 16 for (int i = 0; i setDateTimeFormat("yyyy-M-d h:m");//设置x轴刻度显示格式 22 customPlot->xAxis->setTickLabelRotation(30);//设置刻度标签顺时针旋转30度 23 customPlot->yAxis->setRange(-1000,10000); 24 customPlot->addGraph(); 25 customPlot->graph(0)->setData(xData, yData);//显示数据 26} 27 3.运行结果图: 4.分析

QCPAxisTickerDateTime坐标轴默认是从时间戳起点即1970-1-1 0:0:0开始,以秒为单位进行刻度划分, 以下前两行代码为核心,获取当前秒数,通过第三行代码来设置时间范围。

1QDateTime dateTime = QDateTime::currentDateTime(); 2double  now = dateTime.toTime_t();//当前时间转化为秒 3customPlot->xAxis->setRange(now, now+3600*24);//x轴范围,从当前时间起往后推24小时 4 三、QCPAxisTickerTime 1.QCPAxisTickerTime是时间轴刻度类 1class QCPAxisTickerTime : public QCPAxisTicker 2{ 3 4public: 5 6 enum TimeUnit { tuMilliseconds ///setSubTicks(false); 19 timeTicker->setTickOrigin(3600*3);//x轴起点坐标加3小时,即从当前hours+3开始 20 customPlot->xAxis->setRange(hours*3600, hours*3600 +3600*12); 21 customPlot->yAxis->setRange(-1000,1000); 22 timeTicker->setTimeFormat("%dday-%hhour"); 23 24 QVector yData, xData; 25 for (int i = 0; i addGraph(); 30 customPlot->graph(0)->setData(xData, yData); 31 32} 33 3.运行结果图: 4.分析

时间可以以毫秒、秒、分钟、小时和天显示。取决于通过setTimeFormat函数定义的最大可用单位,超过最大单位的。例如,如果格式字符串为"%M:%s",则为坐标值7815(2小时,10分钟和15秒)被创建,得到的刻度标签将显示"130:15"(130分钟,15秒)。如果格式字符串为"%H:%M:%s",则为"小时"。单位将被使用,标签将是“2:10:15”。

四、QCPAxisTickerText 1.QCPAxisTickerText是文本刻度标签 1/* 2设置文本刻度标签 3*/ 4class QCPAxisTickerText : public QCPAxisTicker 5{ 6public: 7 8 // getters: 9 QMap &ticks();//获得坐标轴标签 10 int subTickCount();//获得子刻度数目 11 12 // setters: 13 void setTicks(const QMap &ticks);//坐标轴标签添加坐标轴 14 void setTicks(const QVector &positions, const QVector labels);//坐标轴标签添加坐标轴 15 void setSubTickCount(int subTicks);//设置子刻度数目 16 17 // non-virtual methods: 18 void clear(); 19 //addTick()坐标轴添加文本标签三种形式 20 void addTick(double position, QString label); 21 void addTicks(const QMap &ticks); 22 void addTicks(const QVector &positions, const QVector &labels); 23 24protected: 25 // property members: 26 QMap mTicks;//坐标轴标签 27 int mSubTickCount;//子刻度数目 28 29 // reimplemented virtual methods: 30 virtual double getTickStep(const QCPRange &range) ; 31 virtual int getSubTickCount(double tickStep) ; 32 virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) ; 33 virtual QVector createTickVector(double tickStep, const QCPRange &range) ; 34 35}; 36 2.据此实现了一个小例子: 1void MainWindow::setupTestQCPAxisTickerText() 2{ 3 //画柱状图 4 QCPBars *regen = new QCPBars(customPlot->xAxis, customPlot->yAxis); 5 regen->setAntialiased(false); // gives more crisp, pixel aligned bar borders 6 regen->setStackingGap(1); 7 regen->setName("Regenerative"); 8 regen->setPen(QPen(QColor(0, 168, 140).lighter(130))); 9 regen->setBrush(QColor(0, 168, 140)); 10 // stack bars on top of each other: 11 // regen->moveAbove(nuclear); 12 QVector ticks; 13 QVector labels; 14 ticks yAxis->setSubTickPen(QPen(Qt::white)); 32 // Add data: 33 QVector regenData; 34 regenData graph(0)->setData(x2, y2); 19 20} 21 3.运行结果图: 六、QCPAxisTickerLog 1.QCPAxisTickerLog设置log对数刻度标签 1class QCPAxisTickerLog : public QCPAxisTicker 2{ 3public: 4 QCPAxisTickerLog(); 5 6 double logBase() const { return mLogBase; } 7 int subTickCount() const { return mSubTickCount; } 8 9 void setLogBase(double base);//设置对数的基数值 10 void setSubTickCount(int subTicks);//设置子刻度数目 11 12protected: 13 double mLogBase; 14 int mSubTickCount; 15 16 double mLogBaseLnInv; 17 18 virtual double getTickStep(const QCPRange &range) ; 19 virtual int getSubTickCount(double tickStep) ; 20 virtual QVector createTickVector(double tickStep, const QCPRange &range) ; 21}; 22 2.据此实现了一个小例子: 1void MainWindow::setupTestQCPAxisTickerLog() 2{ 3 QSharedPointer logTicker(new QCPAxisTickerLog); 4 customPlot->xAxis->setTicker(logTicker); 5 // don't forget to also set the scale type accordingly, otherwise you'll have 6 // logarithmically spaced ticks on a linear axis: 7 customPlot->xAxis->setScaleType(QCPAxis::stLogarithmic); 8 customPlot->xAxis->setRange(0,250); 9 logTicker->setLogBase(10); 10 QVector x2(250), y2(250); 11 for (int i=0; iaddGraph(customPlot->xAxis, customPlot->yAxis); 17 customPlot->graph(0)->setData(x2, y2); 18 19} 20 3.运行结果图: 七、QCPAxisTickerFixed 1.QCPAxisTickerFixed定义轴标尺修改指定的步长控制坐标轴刻度的数目 1 2class QCPAxisTickerFixed : public QCPAxisTicker 3{ 4 5public: 6 7 enum ScaleStrategy { ssNone //固定刻度,不允许修改 8 ,ssMultiples //设置刻度间距为整数倍长度 9 ,ssPowers //设置刻度间距为指数倍长度 10 }; 11 12 // getters: 13 double tickStep() const { return mTickStep; } 14 ScaleStrategy scaleStrategy() const { return mScaleStrategy; } 15 16 // setters: 17 void setTickStep(double step); 18 void setScaleStrategy(ScaleStrategy strategy); 19 20protected: 21 // property members: 22 double mTickStep; 23 ScaleStrategy mScaleStrategy; 24 25 // reimplemented virtual methods: 26 virtual double getTickStep(const QCPRange &range) ; 27}; 28 29 八、完整代码下载 点我下载


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3