1,效果展示
2效果介绍。
1.蓝色坐标轴,带刻度。
2.带坐标轴箭头。
3.背景色选择了黑色(样式表设置),qcustomplot是将widget控件升级为的qcustomplot。将该控件设置样式表即可。
4.鼠标可拖动曲线位置。
5.鼠标滚轮可以放大缩小曲线。
6.可以根据曲线的范围自适应显示范围。### 三级标题
3.人狠话不多,直接上代码。
/// 初始化坐标图CustomPlot 的显示属性 / //注意:我的qcustomplot控件名称就叫ui.widget // 创建蓝色画刷,用于设置坐标轴和刻度的颜色 QBrush brush(QColor(6, 111, 217)); // 设置 x 轴基本画笔 ui.widget->xAxis->setBasePen(QPen(brush, 2)); // 设置 y 轴基本画笔 ui.widget->yAxis->setBasePen(QPen(brush, 2)); // 设置 x 轴刻度画笔 ui.widget->xAxis->setTickPen(QPen(brush, 2)); // 设置 y 轴刻度画笔 ui.widget->yAxis->setTickPen(QPen(brush, 2)); // 设置坐标图的背景为黑色 ui.widget->setBackground(QBrush(QColor(0, 0, 0))); // 显示 y 轴刻度标签 ui.widget->yAxis->setTickLabels(true); // 设置 x 轴上端箭头样式为 SpikeArrow ui.widget->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); // 设置 y 轴上端箭头样式为 SpikeArrow ui.widget->yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); // 设置 x 轴子刻度画笔 ui.widget->xAxis->setSubTickPen(QPen(brush, 2)); // 设置 y 轴子刻度画笔 ui.widget->yAxis->setSubTickPen(QPen(brush, 2)); // 设置 x 轴标签字体样式 QFont f; f.setPixelSize(18); f.setFamily("SimHei"); ui.widget->xAxis->setLabelFont(f); // 设置 x 轴标签颜色为白色 ui.widget->xAxis->setLabelColor(QColor(Qt::white)); // 设置 y 轴标签字体样式 ui.widget->yAxis->setLabelFont(f); // 设置 y 轴标签颜色为白色 ui.widget->yAxis->setLabelColor(QColor(Qt::white)); // 设置 x 轴刻度标签字体样式 QFont f_Tick; f_Tick.setPixelSize(14); f_Tick.setFamily("SimHei"); // 设置 x 轴刻度标签颜色为白色 ui.widget->xAxis->setTickLabelColor(Qt::white); // 设置 y 轴刻度标签颜色为白色 ui.widget->yAxis->setTickLabelColor(Qt::white); // 设置 x 轴刻度标签字体样式 ui.widget->xAxis->setTickLabelFont(f_Tick); // 设置 y 轴刻度标签字体样式 ui.widget->yAxis->setTickLabelFont(f_Tick); // 添加图形层 ui.widget->addGraph(); // 设置 x 轴标签文本 ui.widget->xAxis->setLabel("频率(GHz)"); // 设置 y 轴标签文本 ui.widget->yAxis->setLabel("灰度值"); // 设置坐标图的交互方式,包括范围缩放、范围拖动、选择可绘制项以及多选功能 ui.widget->setInteractions(QCP::iRangeZoom | QCP::Interaction::iRangeDrag | QCP::iSelectPlottables | QCP::iMultiSelect);
void on_LoadData(){ // 构建文件路径,指定为应用程序运行路径下的 "demo.txt" QString fileName = QApplication::applicationDirPath() + QDir::separator() + "demo.txt"; // 创建 QFile 对象,并打开 demo.txt 文件以供只读访问 QFile file(fileName); bool isOk = file.open(QIODevice::ReadOnly); // 清空坐标图上的所有图形 ui.widget->clearGraphs(); // 创建 QTextStream 以便从文件中读取文本数据 QTextStream in(&file); // 添加一个新的图形层 ui.widget->addGraph(); // 设置图形线条的颜色和宽度 ui.widget->graph(0)->setPen(QPen(QColor(255, 115, 45, 255), 2)); // 从文件中读取第一行,解析出图形类型 int type = in.readLine().split(":", QString::SkipEmptyParts)[1].toInt(); // 读取第二行,获取参数字符串 QString paraStr = in.readLine(); // 创建存储 x 和 y 值的 QVector QVector<float> xValue, yValue; // 读取文件中的数据行,解析出 x 和 y 值,并将数据添加到图形层中 while (!in.atEnd()) { QString line = in.readLine(); float x = line.split(",", QString::SkipEmptyParts)[0].toFloat(); float y = line.split(",", QString::SkipEmptyParts)[1].toFloat(); // 根据图形类型判断是否需要筛选数据 if (type != 6) { ui.widget->graph()->addData(x, y); xValue.append(x); yValue.append(y); } else { // 对于图形类型 6,每100个数据点保留一个 if ((int)x % 100 == 0) { ui.widget->graph()->addData(x, y); xValue.append(x); yValue.append(y); } } } // 计算 y 值的最大和最小值 auto max = std::max_element(std::begin(yValue), std::end(yValue)); auto min = std::min_element(std::begin(yValue), std::end(yValue)); // 设置 y 轴的显示范围,留出一定的空间 ui.widget->yAxis->setRange((*min) * 1.1 - (*max) * 0.1, (*max) * 1.1 - (*min) * 0.1); // 设置 x 轴的显示范围,从 xValue 的第一个元素到最后一个元素 ui.widget->xAxis->setRange(xValue.first(), xValue.last()); // 重新绘制坐标图 ui.widget->replot(); }
4.qcustomplt库,我也传一份吧
虽然网上很多,但是防止大家找到付费下载比较麻烦,兄弟们,源码7000行没法直接copy,有需要的私我。