为QtCreator添加一键打包工具

用图文的方式教大家如何添加。0x00 设置入口 0x01 添加工具 0x02 配置打包工具环境 填入下列参数到对应栏目下。由于打包工具会在执行文件目录下生成打包依赖文件,建议在项目文件(.pro)中使用DESTDIR指定执行文件的生成路径。 执行档:%{CurrentProject:QT_HOST_BINS}\windeployqt.exe参数:%{CurrentRun:Executable:FilePath}工作目录:%{CurrentRun:Executable:NativePath} 0x03 效果

October 15, 2019 · 1 min · jiezi

QtCharts之QValueAxis类

文章首发自公众号:: nullobject 。个人站点:https://www.nullobject.cn 这篇文章主要讲解QValueAxis类的API及其使用。0x00 关于QValueAxisQValueAxis,即数值轴,适用于具有连续数据坐标的图表。QValueAxis作为QAbstractAxis的实现类之一,在继承了QAbstractAxis特性的同时,根据数值轴的特点封装实现了许多方便实用的功能。QValueAxis使用起来也非常简单,在上一篇文章QAbstractAxis中的示例代码均是使用QValueAxis实例来说明的。本文主要介绍QValueAxis实现的功能。QValueAxis使用示例:#include <QApplication>#include <QChartView>#include <QLineSeries>#include <QValueAxis>#include <QDebug>QT_CHARTS_USE_NAMESPACEint main(int argc, char *argv[]){ QApplication a(argc, argv); // 创建QChartView对象 QChartView *chartView = new QChartView; chartView->setRenderHint(QPainter::Antialiasing); // 创建序列 QLineSeries *series = new QLineSeries(); // 隐藏图例 chartView->chart()->legend()->hide(); // 添加数据 series->append(0,2); series->append(QPointF(2,6)); series->append(3,8); series->append(7,9); series->append(11,3); *series << QPointF(11,2) << QPointF(15,5) << QPointF(18,4) << QPointF(19,2); // 添加序列到图表 chartView->chart()->addSeries(series); // 创建X轴 QValueAxis *axisX = new QValueAxis; // 设置QValueAxis属性 axisX->setRange(10, 20.5); axisX->setTickCount(5); axisX->setLabelFormat("%.2f"); chartView->chart()->setAxisX(axisX, series); // 创建Y轴 QValueAxis *axisY = new QValueAxis; axisY->setRange(0, 10); axisY->setTickCount(5); axisY->setLabelFormat("%.2f"); chartView->chart()->setAxisY(axisY, series); chartView->resize(400,300); chartView->show(); return a.exec();}效果:0x01 设置刻度线在Qt 5.12版本之前,QValueAxis只支持固定的刻度线设置,只能通过setTickCount设置刻度线的数量,刻度线会平均分布在坐标轴。而在Qt最新版本5.12版中,QValueAxis支持通过tickType属性来设置刻度线为固定分布(TicksFixed)或者是动态分布(TicksDynamic)。QValueAxis::TickType tickType:设置刻度类型QValueAxis::TickType tickType() const;void setTickType(QValueAxis::TickType type);其中TickType为QValueAxis中声明的用于描述刻度类型(刻度线和刻度标签在轴上的位置)的枚举类:enum TickType { TicksDynamic = 0, TicksFixed};tickType属性改变时触发tickTypeChanged(QValueAxis::TickType)信号TicksFixed 设置刻度位置为均匀分布QValueAxis默认的刻度类型为TicksFixed。将刻度类型设置为TicksFixed,可以通过设置tickCount属性值来指定刻度线的数量,此时刻度线会被均匀地地分布在坐标轴上。默认的刻度线数量是5条,最低数量不能低于2。:axisY->setRange(0, 10);axisY->setTickType(QValueAxis::TickType::TicksFixed);axisY->setTickCount(6);效果:其中tickCount的操作函数声明如下:int tickCount() const;void setTickCount(int count);tickCount属性修改只在tickType值为TicksFixed时有效。tickCount属性改变时触发tickCountChanged(int)信号。TicksDynamic 设置刻度位置为动态分布动态设置刻度的位置,需要通过设置锚点tickAnchor和刻度间距tickInterval属性值来实现,必须要设置指定tickInterval才有效果:axisY->setRange(0, 10);axisY->setTickType(QValueAxis::TickType::TicksDynamic);// 设置刻度间距为3axisY->setTickInterval(3);// 设置锚点坐标为5axisY->setTickAnchor(5);效果:其中锚点tickAnchor属性用于指定刻度线和标签开始绘制的位置,刻度间距tickInterval属性用于指定刻度与刻度之间的距离。上示例子中将tickAnchor和tickInterval分别设置为5和3,表示刻度将从坐标为5的位置开始,向轴两端分布,如果不显示设置tickAnchor,则默认从坐标轴的起始位置开始分布;tickInterval的类型为qreal类型,支持设置刻度间隔为小数。修改tickAnchor和tickInterval对应会触发的信号分别为:tickAnchorChanged(int)和tickIntervalChanged(qreal)。0x02 设置坐标轴显示范围QValueAxis通过max和min两个属性来表示坐标轴的最大和最小值,可以通过调用对应的方法来设置坐标轴的显示范围。qreal max:设置坐标轴最大值qreal max() const;void setMax(qreal max);max属性修改会触发maxChanged(qreal)信号。qreal min:设置坐标轴最小值qreal min() const;void setMin(qreal min);min属性修改会触发minChanged(qreal)信号。setRange:设置坐标轴显示范围void setRange(qreal min, qreal max);除了可以调用setMax或setMin单独设置坐标轴的极值外,也可以直接调用setRange同时设置坐标轴的最大、最小值:// axisY->setMin(0);// axisY->setMax(10);// 等价于setRange(0,10);axisY->setRange(0, 10);当坐标轴的最大值max或者最小值min发生改变时,都会触发rangeChanged(qreal min,qreal max)信号。0x03 设置刻度标签显示格式QValueAxis坐标轴支持通过labelFormat属性设置标签的显示格式,例如指定显示小数位数等。QString labelFormat:设置标签格式QString labelFormat() const;void setLabelFormat(const QString &format);其中传参format为需要指定的字符串格式,例如设置为显示小数点后两位数:axisX->setLabelFormat("%.2f");目前labelFormat支持设置以下转换说明符、长度修饰符以及标准C++库中printf()函数提供的格式标志:d, i, o, x, X, f, F, e, E, g, G, c。具体使用可以百度搜索了解:printf() 输出格式。修改该属性会触发labelFormatChanged(const QString&)信号。0x04 The End :) ...

April 3, 2019 · 1 min · jiezi

QtCharts之QAbstractAxis类

文章首发自公众号:: nullobject 。个人站点:https://www.nullobject.cn这篇文章主要讲解QAbstractAxis类的API及其使用0x00 QtCharts中坐标轴结构在学习QAbstractAxis类之前,需要先熟悉QtCharts中轴的组成元素都有哪些:QtCharts中,一个坐标轴的内容大致包含以下几种:轴标题(title)、轴刻度标签(labels)、轴线(lines)、网格线(grid lines)、和轴阴影(shades)。通过QAbstractAxis可以分别对以上几种元素进行单独控制。0x01 设置标题QAbstractAxis可以设置坐标轴标题的显示/隐藏、颜色、内容和字体等几个属性。示例例如,设置坐标轴标题内容为axisTitle,颜色为蓝色,字体15号加粗,并显示出来:// 显示标题 axisXLeft->setTitleVisible(true); // 设置标题内容 axisXLeft->setTitleText(QStringLiteral(“I am axis’s title”));// 设置颜色 axisXLeft->setTitleBrush(QBrush(Qt::blue)); // 设置字体12号加粗 QFont font = axisXLeft->titleFont(); font.setPointSize(15); font.setBold(true); axisXLeft->setTitleFont(font); 结果:titleVisible:设置标题显示bool isTitleVisible() const;void setTitleVisible(bool visible = true);坐标轴标题默认情况下是显示的。修改该属性时会触发titleVisibleChanged(bool visible)信号。titleText:设置标题内容QString titleText() const;void setTitleText(const QString &title);默认情况下,QAbstractAxis不会设置任何标题内容。用户可以根据需要修改坐标轴标题。标题发生改变时会触发titleTextChanged(const QString &text)信号。titleFont:设置标题字体QFont titleFont() const;void setTitleFont(const QFont &font);该属性通过QFont来设置标题的字体风格。该属性发生改变时,会触发titleFontChanged(const QFont &font)信号。titleBrush:设置标题颜色画刷QBrush titleBrush() const;void setTitleBrush(const QBrush &brush);注意目前只支持通过画刷来设置颜色,不支持设置画刷得其他效果(如画刷风格BrushStyle等)。该属性发生改变会触发titleBrushChanged(const QBrush &brush)信号。0x02 设置刻度标签QAbstractAxis除了可以设置坐标轴刻度标签的显示/隐藏、颜色、和字体几个属性外,还可设置刻度标签的倾斜角度。示例例如,设置轴刻度标签显示,倾斜-45度,红色,加粗9号字体:// 显示刻度标签 axisXLeft->setLabelsVisible(true); // 倾斜45度 axisXLeft->setLabelsAngle(-45); // 颜色 axisXLeft->setLabelsColor(Qt::red); // 加粗9号 font = axisXLeft->labelsFont(); font.setBold(true); font.setPointSize(9); axisXLeft->setLabelsFont(font); 效果:labelsAngle:设置倾斜角度int labelsAngle() const;void setLabelsAngle(int angle);设置刻度标签的倾斜角度,默认为水平显示。该属性发生改变时,触发labelsAngleChanged(int angle)信号。labelsColor、labelsBrush:设置颜色QColor labelsColor() const;void setLabelsColor(QColor color);QBrush labelsBrush() const;void setLabelsBrush(const QBrush &brush);轴刻度标签的颜色可以通过labelsColor者labelsBrush任一属性设置来实现。两者的区别在于被修改时触发的信号不一样、修改labelsColor属性稍微便利些而已,且通过修改labelsBrush实现时也只支持修改QBrush颜色,而不支持QBrush的其它属性设置。实际上修改轴刻度标签颜色,内部都是通过设置QBrush来实现。修改labelsColor属性会触发labelsColorChanged(QColor color)信号;修改labelsBrush属性会触发labelBrushChanged(const QBrush &brush)信号。labelsFont:设置字体风格QFont labelsFont() const;void setLabelsFont(const QFont &font);使用方式与修改轴标题字体相同。该属性发生改变会触发labelsFontChanged(const QFont &font)信号。labelsVisible:设置显示/隐藏刻度标签bool labelsVisible() const;void setLabelsVisible(bool visible = true);默认为显示刻度标签。该属性修改时触发labelsVisibleChanged(bool visible)信号:0x03 设置轴线可以设置轴线显示/隐藏、轴线画笔、方向倒置。示例例如显示轴线,并为其设置颜色为红色、宽度为2的画笔:// 显示轴线axisXLeft->setLineVisible(true); // 设置轴线画笔QPen pen = axisXLeft->linePen(); pen.setColor(Qt::red); pen.setWidth(2); axisXLeft->setLinePen(pen);效果:lineVisible:设置显示轴线bool isLineVisible() const;void setLineVisible(bool visible = true);默认会显示轴线。该属性发生改变时会触发lineVisibleChanged(bool visible)信号。linePen:设置轴线画笔QPen linePen() const;void setLinePen(const QPen &pen);通过设置轴线画笔,可以自定义轴线宽度、绘制颜色等。如果只需要修改轴线颜色,可以直接调用setLinePenClolor(QColor color)方法。改属性发生改变时会触发linePenChanged(const QPen &pen)信号。通过setLinePenColor修改轴线颜色时会触发gridLineColorChanged(const QColor &color)信号。reverse:翻转坐标轴bool isReverse() const;void setReverse(bool reverse = true);将坐标轴的极值方向翻转,左侧为默认reverse=false,右侧为翻转之后的效果:注意:该属性仅在使用笛卡尔坐标系的图表上有效,比如折线、曲线、散点图和使用笛卡尔坐标系的面积图。reverse值改变时会触发reverseChanged(bool)信号。0x04 设置网格线QtCharts的坐标轴网格线分为主网格线gridLine和次网格线minorGridLine,主网格线相当于刻度线的延申(例如在QValueAxis),次网格线分布在相邻的两条主网格线之间,且次网格线需要由QAbstractAxis的子类,即具体类型的坐标轴实现才能支持。示例:以QValueAxis为例,显示主次网格线并设置颜色:// 设置网格线/刻度数量axisXLeft->setTickCount(5);axisXLeft->setMinorTickCount(5);// 主网格线axisXLeft->setGridLineVisible(true);axisXLeft->setGridLineColor(Qt::darkGray);// 次网格线axisXLeft->setMinorGridLineVisible(true);axisXLeft->setMinorGridLineColor(Qt::gray);效果:gridVisible、minorGridVisible设置显示网格线// 获取/设置显示主网格线,默认显示bool isGridLineVisible() const;void setGridLineVisible(bool visible = true);// 获取/设置显示次网格线,默认不显示bool isMinorGridLineVisible() const;void setMinorGridLineVisible(bool visible = true);gridVisible改变时触发gridVisibleChanged(bool visible)信号。minorGridVisible改变时触发minorGridVisibleChanged(bool visible)信号。gridLinePen、minorGridLinePen设置网格线画笔// 设置主网格线画笔QPen gridLinePen() const;void setGridLinePen(const QPen &pen);// 设置次网格线画笔QPen minorGridLinePen() const;void setMinorGridLinePen(const QPen &pen);与轴线颜色的设置类似,如果只需要修改网格线的颜色,可以直接调用对应的setGridLineColor(const QColor &color)或者setMinorGridLineColor(const QColor &color)方法快速设置。gridLinePen改变时触发gridLinePenChanged(const QPen &pen)信号。minorGridLinePen改变时触发minorGridLinePenChanged(const QPen &pen)信号。gridLineColor改变时触发gridLineColorChanged(const QPen &pen)信号。minorGridLineColor改变时触发minorGridLineColorChanged(const QPen &pen)信号。0x05 设置阴影QtCharts坐标轴阴影指的是相邻主网格线之间的区域。QAbstractAxis中提供了对阴影边框(shadesBorder)、阴影区域(shadesArea)的设置:示例以QValueAxis为例,设置坐标轴的阴影边框和填充:// 显示阴影区域,包括阴影边框axisXLeft->setShadesVisible(true);// 设置阴影边框QPen sPen = axisXLeft->shadesPen();sPen.setWidth(5);sPen.setColor(Qt::yellow);axisXLeft->setShadesPen(sPen);//axisXLeft->setShadesBorderColor(Qt::darkYellow);// 设置阴影区域颜色填充axisXLeft->setShadesBrush(QBrush(QColor(48,157,255,125)));//axisXLeft->setShadesColor(Qt::blue);效果:shadesBorderColor、shadesPen设置阴影边框QColor shadesBorderColor() const;void setShadesBorderColor(QColor color);QPen shadesPen() const;void setShadesPen(const QPen &pen);设置阴影边框,如果只需要改变颜色可以直接调用setShadesBorderColor(QColor),需要设置更多属性可以调用setShadesPen(const QPen&)为阴影边框设置一个画笔对象。shadesBorderColor属性改变会触发shadesBorderColorChanged(QColor color)信号。shadesPen属性改变会触发shadesPenChanged(const QPen &pen)信号。shadesBrush、shadesColor设置阴影区域填充QBrush shadesBrush() const;void setShadesBrush(const QBrush &brush);QColor shadesColor() const;void setShadesColor(QColor color);设置阴影区域填充,如果只需要修改颜色可以直接使用setShadesColor(QColor),需要设置更多效果可以调用setShadesBrush(const QBrush&)为阴影区域设置一个画刷,例如,设置画刷的填充风格为DiagCrossPattern:QBrush sBrush = axisXLeft->shadesBrush();sBrush.setColor(QColor(48,157,255,125));// 设置画刷风格sBrush.setStyle(Qt::BrushStyle::DiagCrossPattern);axisXLeft->setShadesBrush(sBrush);效果:shadesBrush值修改会触发shadesBrushChanged(const QBrush &brush)信号。shadesColor值修改会触发shadesColorChanged(QColor color)信号。0x06 The End :) ...

April 2, 2019 · 2 min · jiezi

QtCharts之QXYSeries

文章首发自公众号:: nullobject 。个人站点:https://www.nullobject.cn这篇文章主要介绍QXYSeries类的API及其使用0x00 前言QXYSeries作为QAbstractSeries的派生类之一,主要负责实现以二维点集为数据源,坐标类型为二维坐标系的图表类型,包括折线图、曲线图和散点图等。QXYSeries封装了大量对数据源进行增删改操作的函数和信号,同时内部实现了控制数据点在坐标系上的显示形态(点标签的格式、颜色、是否显示等)的功能。0x01 显示和控制点标签Qt图表中的点标签指的是数据点在图表上对应位置的附加信息显示(比如点的坐标或者其他信息):QXYSeries类中提供了pointLabels*开头的五个属性及对应的方法和信号来操作点标签的显示风格。pointLabelsClipping : 获取和设置是否对点标签超出绘图区域边缘的部分进行裁剪:bool pointLabelsClipping() const;void setPointLabelsClipping(bool enabled = true);效果:可以看到,当设置pointLabelsClipping属性为true(默认值)时,点标签超出绘图区域的部分会被裁剪掉。pointLabelsClipping属性发生改变时,会触发pointLabelsClippingChanged(bool clipping)信号。pointLabelsColor : 获取和设置点标签的显示颜色:QColor pointLabelsColor() const;void setPointLabelsColor(const QColor &color);效果:上图分别为将pointLabelsColor属性设置为黑色和绿色的效果。看到这您有可能会有疑问:咦怎么只改变了坐标的颜色,而折线上点的颜色没有变?注意了,这里的点标签是指图表上对数据点加以说明的信息部分,不包括点本身的显示。pointLabelsColor属性发生改变时,会触发pointLabelsColorChanged(const QColor &color)信号。pointLabelsFont : 获取和设置点标签的显示字体:QFont pointLabelsFont() const;void setPointLabelsFont(const QFont &font);该属性通过一个QFont设置来实现:// 获取pointLabels默认字体QFont font = series->pointLabelsFont();// 加粗font.setBold(true);// 斜体font.setItalic(true);// 设置字体大小font.setPointSize(12);// 设置字体为Arial类型font.setFamily(QStringLiteral(“Arial”));// 更新pointLabels字体series->setPointLabelsFont(font);效果:pointLabelsFont属性发生改变时,会触发pointLabelsFontChanged(const QFont &font)信号。pointLabelsFormat : 获取和设置点标签的显示格式:QString pointLabelsFormat() const;void setPointLabelsFormat(const QString &format);QXYSeries类提供了两个占位符来设置点标签显示真实坐标数据:@xPointX轴坐标@yPointY轴坐标例如,我们需要以:(15,23)这样的格式来显示点标签,可以这样设置,即可实现上文中点标签的显示格式效果:// 设置点标签格式series->setPointLabelsFormat(QStringLiteral("(@xPoint,@yPoint)"));pointLabelFormat属性默认被设置为没有括号的坐标格式:@xPoint, @yPoint。pointLabelsFormat属性发生改变时,会触发pointLabelsFormatChanged(const QString &format)信号。pointLabelsVisible : 获取和设置显示/隐藏点标签:bool pointLabelsVisible() const;void setPointLabelsVisible(bool visible=true);该属性默认被设置为false。// 隐藏点标签series->setPointLabelsVisible(false);效果:pointLabelsVisible属性发生改变时,会触发pointLabelsVisibilityChanged(bool visible)信号。pointsVisible : 获取和设置显示/隐藏点在图表上的标注:bool pointsVisible() const;void setPointsVisible(bool visible=true);与pointsLabelVisible不同,pointsLabelVisible设置的是点标签的显示,而pointsVisible设置的是点本身在图表上的位置标注。该属性默认被设置为false。对比显示和隐藏点标注效果:0x02 对数据源进行增删改QXYSeries类中封装了一系列的重载方法用于操作图表的数据源进行增删改。QXYSeries内部用一个模板类型为QPointF的QVector来持有数据源,其声明在qxyseries_p.h头文件内:增加数据可以调用append的对应重载方法,或者是重载操作符<<添加单个点或者整个点集到数据源的尾部:void append(qreal x, qreal y);void append(const QPointF &point);void append(const QList<QPointF> &points);QXYSeries& operator<<(const QPointF &point);QXYSeries& operator<<(const QList<QPointF> &points);也可以调用insert方法将数据点插入到数据源的指定位置:void insert(int index, const QPointF &point);对应地,不管以何种方式,成功添加数据后都会触发pointAdded(int index)信号,index为被添加的数据的下标。需要注意:每添加一个点就会触发一次pointAdded信号,即批量添加数据时会触发对应次数的pointAdded。删除数据QXYSeries提供了remove重载方法和removePoints方法来移除目标数据:// 删除指定坐标的点void remove(qreal x, qreal y);void remove(const QPointF &point);// 删除指定索引下标的点void remove(int index);// 从下标index位置开始,删除count数量的点void removePoints(int index, int count);与增加数据类似,成功删除数据后会触发对应次数的pointRemoved(int index)信号,index为被删除的数据的下标。修改数据源修改数据源通过replace系列的重载方法实现:// 替换具体坐标的点void replace(qreal oldX, qreal oldY, qreal newX, qreal newY);void replace(const QPointF &oldPoint, const QPointF &newPoint);// 替换指定索引下标的点void replace(int index, qreal newX, qreal newY);void replace(int index, const QPointF &newPoint);// 替换整个数据源void replace(QList<QPointF> points);void replace(QVector<QPointF> points);当只替换数据源的局部数据点(调用前四种重载方法)时,会触发pointReplaced(int index)信号,index为被替换的点的下标;而当替换了整个数据源数据(调用后两种方法)时,则会触发pointsReplaced()信号。需要注意:调用replace后两种重载替换整个数据源时,传QList还是传QVector在性能上是有所区别的:直接传入QList结构的数据集远远比逐个点替换或者先清除所有点再添加这两种方式的效率要高。而直接传入QVector结构的数据集又比前者效率要高。因此:需要批量更新数据点时,应当优先选择void replace(QVector<QPointF> points);这个重载方法。究其原因:本小节一开始就介绍了,QXYSeries内部持有数据源的数据结构为QVector<QPointF>,而参数为QList<QPointF>的重载方法的内部实现也是将QList转换为QVector,再调用参数为QVector<QPointF> 的重载方法实现对数据的更新,无形中多了一个数据转换的步骤,拉低性能:Tips:QList和QVector两个容器本身的效率上也是有区别的,Qt官方推荐优先使用QVector。详细可以参考QVector的官方文档介绍。获取数据源QXYseries提供了返回类型分别为QList<QPointF>和QVector<QPointF>的方法获取数据源:QList<QPointF> points() const;QVector<QPointF> pointsVector() const;与更新replace方法批量更新数据源的重载类似,points()方法获取数据源的方法,内部实现也是获取原始数据源再将其转为QList类型返回;pointsVector()方法则直接返回原始的QVector数据源。0x03 QXYSeries中的鼠标操作QXYSeries共提供了五个鼠标事件响应信号,分别是:单击clicked、双击doubleClicked、鼠标键按下pressed,鼠标键松开released、光标移到图表线上或从图表移开hovered:series->connect(series,&QLineSeries::clicked,[](const QPointF& point){ qDebug() << “point clicked:” << point;});series->connect(series,&QLineSeries::doubleClicked,[](const QPointF& point){ qDebug() << “point double clicked:” << point;});series->connect(series,&QLineSeries::hovered,[](const QPointF& point,bool state){ qDebug() << “point hovered:” << point << " state:" << (state?“光标移动到图表上”:“光标从图表上移开”);});series->connect(series,&QLineSeries::pressed,[](const QPointF& point){ qDebug() << “point pressed:” << point;});series->connect(series,&QLineSeries::released,[](const QPointF& point){ qDebug() << “point released:” << point;});运行程序,执行光标移动到图表序列上->左键双击->光标从图表序列上方移开,结果如下:point hovered: QPointF(4.58291,8.71473) state: moved to seriespoint pressed: QPointF(4.58291,8.71473)point released: QPointF(4.58291,8.71473)point clicked: QPointF(4.58291,8.71473)point double clicked: QPointF(4.58291,8.71473)point pressed: QPointF(4.58291,8.71473)point released: QPointF(4.58291,8.71473)point clicked: QPointF(4.58291,8.71473)point hovered: QPointF(4.71022,8.18182) state: moved from series0x04 The End. ...

March 30, 2019 · 2 min · jiezi