白昼皓月 2024-03-10 19:21 采纳率: 0%
浏览 9

qt 中charts图表添加的数据不正确

img


依图可见我添加的数据不为零,它的初始化为零
但是为什么添加进去的数据不正确
源码


#include "hum_wdiget.h"
#include "ui_hum_wdiget.h"

hum_wdiget::hum_wdiget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::hum_wdiget)
{
    ui->setupUi(this);

    char_hum_init(); //初始化

    create_hum_charts(); //创建图表

    // 连接定时器的timeout信号到槽函数,时间到时就刷新图表
    connect(timer, &QTimer::timeout, this, &hum_wdiget::get_hum_charts);
    connect(timer, &QTimer::timeout, this, &hum_wdiget::syn_hum_charts);
    // 设置定时器间隔为1000毫秒(1秒)
        timer->start(2000);

}

//同步
void hum_wdiget::get_hum_charts()
{
    emit requestData();
}

void hum_wdiget::setData(int humidity)
{
      hum = humidity;
//    qDebug() << hum;
    syn_hum_charts();

}

void hum_wdiget::syn_hum_charts()
{
    qDebug() << "syn_hum_charts called with hum = " << hum;
    second++;
    series_hum->append(second, hum);
    chart_hum->update();
    view_hum.repaint(); // 手动触发图表重绘
    axis_hum->setRange(second - 10, second + 10); // 假设我们希望显示最近5秒内的数据

    // 强制处理未处理的事件,有助于确保视图及时更新
    QCoreApplication::processEvents();

    qDebug() << "Chart range: " << axis_hum->min() << "-" << axis_hum->max();
    qDebug() << "Data points: " << series_hum->count();
    qDebug() << "syn_hum_charts " << hum;
}


//创建
void hum_wdiget::create_hum_charts()
{
    //设置折线
    series_hum->setName("湿度");
    series_hum->setPointLabelsVisible(true);    //设置显示数字
    series_hum->setPointsVisible(true);         //设置显示点
    series_hum->setPointLabelsFormat("@yPoint");    //设置只显示y轴

    series_hum->append(1, 20);
    series_hum->append(2, 30);
    series_hum->append(3, 40);
    series_hum->append(5, 20);
    series_hum->append(6, 20);

    //设置坐标轴
    axis_hum->setRange(0, 10);
    axis_hum->setTitleText("时间(秒)");
    ayis_hum->setRange(0, 100);
    ayis_hum->setTitleText("湿度(百分比)");

    //创建表
    chart_hum = new QChart();
    chart_hum->setTitle("湿度折线");
    chart_hum->addAxis(axis_hum,Qt::AlignBottom);   //x轴添加到底部
    chart_hum->addAxis(ayis_hum, Qt::AlignLeft);    //y轴添加到左侧
    chart_hum->setMargins(QMargins(10, 10, 10, 10));
    chart_hum->legend()->setVisible(true);
    chart_hum->addSeries(series_hum);

    //序列添加到坐标轴
    series_hum->attachAxis(axis_hum);
    series_hum->attachAxis(ayis_hum);

    //设置视图
    view_hum.setChart(chart_hum);
    view_hum.setRenderHint(QPainter::Antialiasing);

    // 将视图添加到布局中)
    vbox_hum->addWidget(&view_hum);
    setLayout(vbox_hum);
    // 调整视图大小以适应其内容
    view_hum.fitInView(chart_hum->plotArea(), Qt::KeepAspectRatio);

}

//初始化
void hum_wdiget::char_hum_init()
{
//    widgt = new Widget();
    timer = new QTimer(this);
    chart_hum = new QChart();
    series_hum = new QLineSeries();
    vbox_hum = new QVBoxLayout();
    axis_hum = new QValueAxis;
    ayis_hum = new QValueAxis;
}


hum_wdiget::~hum_wdiget()
{
    delete ui;
}


void hum_wdiget::setPort(int newPort)
{
    port = newPort;
}

void hum_wdiget::setHum(int newHum)
{
    hum = newHum;
}

int hum_wdiget::getPort() const
{
    return port;
}

int hum_wdiget::getHum() const
{
    return hum;
}

  • 写回答

4条回答 默认 最新

  • 关注

    白昼皓月 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据您提供的代码,我看到您尝试在Qt中使用Charts图表库添加数据并显示,但是添加的数据不正确。根据代码分析,可能的原因有以下几点:

    1. 您在setData函数中通过setData(int humidity)方法将hum的值设置为传入的humidity值,但是并没有把hum的值传递给series_hum,导致添加的数据不正确。

    2. syn_hum_charts()函数中,每次添加数据时,series_hum的x轴坐标都是通过second来设置的,但是您并没有清空series_hum之前的数据,所以新添加的数据的x轴坐标可能与旧数据冲突。

    基于以上问题,我提供以下解决方案:

    1. 请您修改setData函数,添加以下代码来把hum的值传递给series_hum

      void hum_wdiget::setData(int humidity)
      {
          hum = humidity;
          series_hum->replace(series_hum->count()-1, QPoint(second, hum)); // 替换最后一个数据点的y值
          syn_hum_charts();
      }
      
    2. syn_hum_charts()函数中,添加以下代码来清空series_hum之前的数据:

      series_hum->clear();
      

    根据以上修改,完整的代码如下:

    void hum_wdiget::setData(int humidity)
    {
        hum = humidity;
        series_hum->replace(series_hum->count()-1, QPoint(second, hum));
        syn_hum_charts();
    }
    
    void hum_wdiget::syn_hum_charts()
    {
        series_hum->clear(); // 清空数据
        second++;
        series_hum->append(second, hum);
        chart_hum->update();
        view_hum.repaint();
        axis_hum->setRange(second - 10, second + 10);
    
        QCoreApplication::processEvents();
    
        qDebug() << "Chart range: " << axis_hum->min() << "-" << axis_hum->max();
        qDebug() << "Data points: " << series_hum->count();
        qDebug() << "syn_hum_charts " << hum;
    }
    

    解决方案:

    1. 修改setData函数,将hum的值传递给series_hum的最后一个数据点。
    2. sny_hum_charts函数中,先清空series_hum的数据,然后再添加新的数据。
    3. 运行程序,查看图表数据是否正确。

    希望以上解决方案对您有所帮助!如果还有其他问题,请随时提问。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?