当前位置: 首页 > news >正文

【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析

四个联动图表(main1/main2 联动,sub3/sub4 联动)
高频信号由外部接口实时传入(X, Y 坐标)
鼠标跟随竖线 + 点击显示坐标
黑底紫轴绿柱的视觉风格
使用 QSplitter 实现可拖动调整大小的 2x2 布局
兼容 Qt Designer UI 文件

项目结构
SpectrumMonitor/
├── SpectrumMonitor.pro
├── main.cpp
├── mainwindow.h
├── mainwindow.cpp
├── mainwindow.ui
├── qcustomplot.h
└── qcustomplot.cpp

  1. .pro 文件
    pro
QT       += core gui widgets
CONFIG   += c++17
TARGET    = SpectrumMonitor
TEMPLATE  = appSOURCES  += main.cpp \mainwindow.cpp \qcustomplot.cppHEADERS  += mainwindow.h \qcustomplot.hFORMS    += mainwindow.ui

#关键:包含当前目录
INCLUDEPATH += $$PWD

 2. main.cpp
cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();// 模拟外部高频信号注入(实际项目中由检测算法调用)QTimer::singleShot(1500, &w, [&]() {w.addHighFreqSignal(250.0, 120.0); // X=250MHz, Y=120});QTimer::singleShot(3000, &w, [&]() {w.addHighFreqSignal(320.5, 95.0);  // X=320.5MHz, Y=95});return a.exec();
}
 mainwindow.h
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QCustomPlot>
#include <QCPItemText>
#include <vector>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();// 外部接口:注入高频信号 (X: MHz, Y: 幅度)void addHighFreqSignal(double x, double y);protected:bool eventFilter(QObject* obj, QEvent* event) override;private slots:void updateSignalPlots(); // 定时器回调private:void setupPlots();void setupSplitter();void setupTimers();void updateGroupFollowLine(QCustomPlot* plot, double xCoord);void clearGroupFollowLines(QCustomPlot* plot);double generateSignalPoint(int i);Ui::MainWindow *ui;QCPItemText* coordLabel;QTimer* m_plotTimer;// 高频信号队列 (X, Y)std::vector<std::pair<double, double>> ```cpp
m_highFreqQueue;
};
#endif // MAINWINDOW_H
4. mainwindow.cpp```cpp
cpp
#include "mainwindow.h"obj == ui->sub3Plot || obj == ui->sub4Plot) {auto e = static_cast<QMouseEvent*>(event);QCustomPlot* plot = qobject_cast<QCustomPlot*>(obj);double x = plot->xAxis->pixelToCoord(e->pos().x());double y = plot->yAxis->pixelToCoord(e->pos().y());coordLabel->setText(QString("%1 %2").arg(x, 0, 'f', 1).arg(y, 0, 'f', 2));coordLabel->position->setCoords(x, y);coordLabel->setVisible(true);plot->replot();return true;}}return QMainWindow::eventFilter(obj, event);
}void MainWindow::updateGroupFollowLine(QCustomPlot* plot, double xCoord) {// 清除旧线for (int i = plot->itemCount() - 1; i >= 0; --i) {if (plot->item(i)->inherits("QCPItemLine")) {plot->removeItem(plot->item(i));}}// 设置 Y 范围double yMax = (plot == ui->main1Plot || plot == ui->sub3Plot) ? 300 : 100;// 创建新线QCPItemLine* line = new QCPItemLine(plot);line->start->setCoords(xCoord, 0);line->end->setCoords(xCoord, yMax);line->setPen(QPen(Qt::red, 1, Qt::DashLine));plot->replot();
}void MainWindow::clearGroupFollowLines(QCustomPlot* plot) {for (int i = plot->itemCount() - 1; i >= 0; --i) {if (plot->item(i)->inherits("QCPItemLine")) {plot->removeItem(plot->item(i));}}coordLabel->setVisible(false);plot->replot();
}
  1. mainwindow.ui 设计要点
    拖入 4 个 QWidget
    提升(Promote)为 QCustomPlot:
    右键 QWidget → Promote to…
    Base class: QWidget
    Promoted class: QCustomPlot
    Header file: qcustomplot.h
    设置 objectName:
    main1Plot, main2Plot, sub3Plot, sub4Plot
    注意:UI 文件中不要设置布局!布局由 setupSplitter() 代码控制。

使用说明
将 qcustomplot.h/.cpp 放在项目根目录
在 Qt Designer 中提升 4 个 QWidget 为 QCustomPlot
编译运行
外部系统调用 addHighFreqSignal(x, y) 注入信号

http://www.dtcms.com/a/494792.html

相关文章:

  • 用于博客美化的测试(后面再更新)
  • 【一文了解】正则表达式
  • MySQL中表操作
  • 中国建设银行大学助学贷款网站网站备案对网站负责人的要求
  • 江门云建站模板东城企业网站开发
  • 使用Selenium Server 4连接已经运行的Firefox
  • 普蓝机器人PlanRobot-DR200:基于多传感融合的全天候电力巡检自主导航技术与实践
  • PHPCMS V9 自定义证书查询模块(Ajax+防刷+倒计时)
  • 一体化运维平台:当下运维体系的核心支柱
  • HarmonyOS后台任务管理:短时任务与长驻任务实战
  • Unity游戏基础-6(跨平台生成游戏作品,针对安卓教程)
  • Luminex xMAP技术原理与应用概述
  • Http基础协议和解析
  • 官方网站页面尺寸html网页设计作品中国传统文化
  • h5游戏免费下载:激射神经猫
  • 商业航天与数字经济(二):商业航天重构全球数字经济的底层逻辑
  • 免费社区建站系统vue做的商城网站
  • 中电金信:首个金融信创中试平台揭牌,架设国产软硬件落地应用的“高速通道”
  • 主流移动通信标准
  • SNK施努卡驱动电机自动生产线,转子+电机总成含EOL测试
  • 解决方案 - 宽带多通道同步采集系统
  • Nginx、uwsgi、uWSGI、WSGI和Django的关系
  • 牛童三国单机游戏Unity源码 免费开源
  • 团工作网站建设意见网站编辑做图片用什么不同
  • C#,VB.NET数组去重复,提取键名和重复键和非重复键
  • java建筑工地智能交互平台源码,智慧工地SaaS云平台,对现场人员、材料、机械、质量、安全进行高效管控
  • 【计算机网络笔记】计算机网络学习笔记1
  • 企业网站添加栏目龙华建网站多少钱
  • 建安证查询网站制作二维码网站免费
  • iOS八股文之 内存管理