精华内容
下载资源
问答
  • Qt绘制坐标轴

    2017-09-24 02:43:04
    主要是纯Qt绘图,绘制RT数据,支持框选局部放大查看 也可以进行多通道数据显示,在代码基础上可拓展性比较强。
  • 【转】Qt绘制坐标轴

    千次阅读 2010-01-13 18:22:00
    绘制坐标处的月   int monthX = deltaX * (i - 1 ) + ((deltaX - stringWidth) / 2 );  painter.drawText(monthX, textHeight, month);  }     // 画纵坐标  painter.drawLine( 0 , 0 ...

     

    =====================================Widget.h=====================================

    #ifndef WIDGET_H

    #define WIDGET_H

     

    #include <QWidget>


    namespace Ui {

        class Widget;

    }

     

    class Widget : public QWidget {

        Q_OBJECT

    public:

        Widget(QWidget *parent = 0);

        ~Widget();

     

    protected:

        virtual void changeEvent(QEvent *e);

        virtual bool eventFilter(QObject *watched, QEvent *e);

        void paintOnWidget(QWidget *w);

     

    private:

        Ui::Widget *ui;

    };

     

    #endif // WIDGET_H

     

     

    =====================================Widget.cpp=====================================

    #include "Widget.h"

    #include "ui_Widget.h"

    #include <QtGui/QPainter>

     

    Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {

        ui->setupUi(this);

        ui->widget->installEventFilter(this);

    }

     

    Widget::~Widget() {

        delete ui;

    }

     

    void Widget::changeEvent(QEvent *e) {

        QWidget::changeEvent(e);

        switch (e->type()) {

        case QEvent::LanguageChange:

            ui->retranslateUi(this);

            break;

        default:

            break;

        }

    }

     

    bool Widget::eventFilter(QObject *watched, QEvent *e) {

        if (watched == ui->widget) {

            if (e->type() == QEvent::Paint) {

                paintOnWidget(ui->widget);

                return true;

            }

        }

     

        return QWidget::eventFilter(watched, e);

    }

     

    void Widget::paintOnWidget(QWidget *w) {

        QPainter painter(w);

     

        QFontMetrics metrics = painter.fontMetrics();

        int textHeight = metrics.ascent() + metrics.descent();

     

        int leftWidth = metrics.width(tr("9000")) + 5;

        int rightWidth = metrics.width(tr("()"));

        int width = w->size().width() - leftWidth - rightWidth;

        int height = w->size().height() - 3 * textHeight;

     

        // 绘制外框

        painter.drawRect(0, 0, w->size().width() -1, w->size().height() - 1);

        // 移动坐标系

        //painter.translate(inset * 2, ui->yearWidget->size().height() - inset);

        painter.translate(leftWidth, 1.75 * textHeight + height);

     

        int totalCount = 9000; // 默认每年收入9000件衣服

        int count = 10;        // 分成10

        float deltaX = width / 12.0f;         // x坐标上每分的宽度

        float deltaY = (float)height / count; // y坐标上每分的宽度

     

     

        // 画横坐标

        painter.drawLine(0, 0, width, 0);

        for (int i = 1; i <= 12; ++i) {

            QString month = tr("%1").arg(i);

            int stringWidth = metrics.width(month);

     

            // 绘制坐标刻度

            painter.drawLine(deltaX * i, 0, deltaX * i, 4);

     

            // 绘制坐标处的月

            int monthX = deltaX * (i - 1) + ((deltaX - stringWidth) / 2);

            painter.drawText(monthX, textHeight, month);

        }

     

        // 画纵坐标

        painter.drawLine(0, 0, 0, -height);

        painter.drawText(-metrics.width(tr("()")),

                         -(deltaY * count + textHeight / 2 + metrics.descent()),

                         tr("()"));

        for (int i = 1; i <= count; ++i) {

            QString value = QString("%1").arg(i * totalCount / count);

            int stringWidth = metrics.width(value);

     

            // 绘制坐标刻度

            painter.drawLine(-4, -i * deltaY, 0, -i * deltaY);

     

            // 绘制坐标值

            //painter.drawText(-stringWidth - 4, -i * deltaY + stringHeight / 2, value);

            painter.drawText(-stringWidth - 4, -(deltaY * i + textHeight / 2 - metrics.ascent()), value);

        }

     

        //    // 绘制每个月收到的服饰

        //    painter.setBrush(Qt::BDiagPattern);

        //    for (int i = 0; i < yearList.size(); ++i) {

        //        painter.setPen(Qt::black);

        //        int fineryCount = yearList.at(i); // i + 1个月收到的服饰件数

        //        int h = fineryCount / (float)totalCount * height;

        //        painter.drawRect(deltaX * i + 2, 0, deltaX - 4, -h);

        //

        //        // 绘制收到的服饰件数

        //        QString fineryString = QString("%1").arg(fineryCount);

        //        int stringWidth = metrics.width(fineryString);

        //

        //        if (h > height) {

        //            h = height;

        //        }

        //

        //        painter.setPen(Qt::red);

        //        //painter.drawText(deltaX * i + (deltaX - stringWidth) / 2, -(h + metrics.descent()), fineryString);

        //    }

    }

    展开全文
  • Qt基础编程 绘制坐标轴

    千次阅读 2015-04-25 17:22:37
    //mainwindow.cpp #include "pointsave.h" #include "mainwindow.h" #include "ui_mainwindow.h"#include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...
    <img src="https://img-blog.csdn.net/20150425172635867?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlxdWFuMDAxNzg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
    //mainwindow.cpp
    #include "pointsave.h"
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    <span style="font-family: Arial, Helvetica, sans-serif;">#include <QString></span>
    #include<QGraphicsView>
    #include<QGraphicsScene>
    #include<QGraphicsLineItem>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     //   QGraphicsLineItem *item = new QGraphicsLineItem(-100,100,0,0);
    
        QGraphicsScene *scene=new QGraphicsScene();
    scene->addLine(-340,150,-340,-150);
    scene->addLine(-340,-150,-343,-146);
    scene->addLine(-340,-150,-337,-146);
    scene->addLine(-340,150,340,150);
    scene->addLine(340,150,336,147);
    scene->addLine(340,150,336,153);
    for(int i=-240;i<350;i+=100)
    {
        scene->addLine(i,150,i,-150);
    
    
    }
    for(int i=150;i>-150;i-=100)
    {
        scene->addLine(-340,i,340,i);
    }
    
        scene->setSceneRect(-(ui->graphicsView->width()/2),-(ui->graphicsView->height()),ui->graphicsView->width()*2,ui->graphicsView->height()*2);
    
        ui->graphicsView->setScene(scene);
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    
    }
    
    void MainWindow::on_pushButton_4_clicked()
    {
       extern Pointtt point;
        point.AddPoint(ui->lineEdit->text().toInt(),ui->lineEdit_2->text().toInt());
        ui->textEdit->append(ui->lineEdit->text()+","+ui->lineEdit_2->text()+";");
         Pointtt::po  *pdd;
         pdd=&point.rehead();
    
        // ui->textEdit->setText(QString::number(pdd->next->x));
    
    }
    
    void MainWindow::on_pushButton_2_clicked()
    {
        ui->graphicsView->scale(1.5,1.5);
    }
    
    
    
    void MainWindow::on_pushButton_clicked()
    {
        ui->graphicsView->scale(0.5,0.5);
    }
    
    void MainWindow::on_pushButton_3_clicked()
    {
        extern Pointtt point;
        extern QGraphicsScene scene;
        Pointtt::po *dd;
        Pointtt::po *ddd;
        //ui->graphicsView->scene()->clear();
        dd=&point.rehead();
        for(ddd=dd->next;ddd!=nullptr;ddd=ddd->next)
        {
             ui->graphicsView->scene()->addLine((-340+dd->x),(150-dd->y),(-340+ddd->x),(150-ddd->y));
             dd=dd->next;
        }
    }
    
    <pre name="code" class="cpp">//mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    
    private slots:
        void on_pushButton_4_clicked();
    
        void on_pushButton_2_clicked();
    
    
    
        void on_pushButton_clicked();
    
        void on_pushButton_3_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    


    
    

    //pointsave.h
    #ifndef POINTSAVE
    #define POINTSAVE
    
    class Pointtt
    {
    public:
        struct po
        {
            int x;
            int y;
            struct po *next;
        };
    private:
         struct po *cc;
         struct po head;
    
    
    public:
         Pointtt();
         struct po rehead();
        void AddPoint(int xx,int yy);
    
    };
    
    #endif // POINTSAVE
    
    

    //pointsave.cpp
    #include"pointsave.h"
    Pointtt point;
    
    void Pointtt ::AddPoint(int xx,int yy)
    {
        po *p;
        p=new  po;
        p->x =xx;
        p->y=yy;
         po *f;
        f=&head;
        for(cc=head.next;cc!=nullptr;cc=cc->next)
        {
            if(p->x<cc->x)
            {
                 po *u;
                u=f->next;
                f->next=p;
                p->next=u;
                return ;
            }
            f=f->next;
        }
        f->next=p;
        p->next=nullptr;
    }
    Pointtt::Pointtt()
    {
        this->head.x=0;
        this->head.y=0;
        this->head.next=nullptr;
    }
    
    Pointtt::po Pointtt::rehead()
    {
        return this->head;
    }
    
    

    //mainwindow.ui
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>711</width>
        <height>420</height>
       </rect>
      </property>
      <property name="minimumSize">
       <size>
        <width>711</width>
        <height>420</height>
       </size>
      </property>
      <property name="maximumSize">
       <size>
        <width>711</width>
        <height>420</height>
       </size>
      </property>
      <property name="sizeIncrement">
       <size>
        <width>711</width>
        <height>420</height>
       </size>
      </property>
      <property name="baseSize">
       <size>
        <width>711</width>
        <height>420</height>
       </size>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QGraphicsView" name="graphicsView">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>0</y>
          <width>711</width>
          <height>331</height>
         </rect>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>340</y>
          <width>21</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>-</string>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton_2">
        <property name="geometry">
         <rect>
          <x>50</x>
          <y>340</y>
          <width>21</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>+</string>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton_3">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>380</y>
          <width>51</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>build</string>
        </property>
       </widget>
       <widget class="QTextEdit" name="textEdit">
        <property name="geometry">
         <rect>
          <x>250</x>
          <y>330</y>
          <width>461</width>
          <height>91</height>
         </rect>
        </property>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>111</x>
          <y>340</y>
          <width>16</width>
          <height>16</height>
         </rect>
        </property>
        <property name="text">
         <string>x:</string>
        </property>
       </widget>
       <widget class="QLabel" name="label_2">
        <property name="geometry">
         <rect>
          <x>111</x>
          <y>357</y>
          <width>16</width>
          <height>16</height>
         </rect>
        </property>
        <property name="text">
         <string>y:</string>
        </property>
       </widget>
       <widget class="QLineEdit" name="lineEdit">
        <property name="geometry">
         <rect>
          <x>129</x>
          <y>340</y>
          <width>91</width>
          <height>20</height>
         </rect>
        </property>
       </widget>
       <widget class="QLineEdit" name="lineEdit_2">
        <property name="geometry">
         <rect>
          <x>129</x>
          <y>357</y>
          <width>91</width>
          <height>20</height>
         </rect>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton_4">
        <property name="geometry">
         <rect>
          <x>130</x>
          <y>380</y>
          <width>75</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>addpoint</string>
        </property>
       </widget>
      </widget>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    


    展开全文
  • QtCharts 时间坐标轴以及利用定时器动态绘制图形


    先放效果图
    在这里插入图片描述

    写在前面

    这片文章是之前文章思路上来的,之前的这篇文章是在项目初期,刚开始使用QtCharts时候写的,当时比较匆忙,没有太多时间编写一个Demo,代码也是从项目中抠出来的,难免会有不足之处,现在看起来有点晦涩,可能对大家的帮助不大,所以想进行一定修改,让大家能够更好的使用Qt自带的折线图,实现更多功能。
    本来是想在之前的文章上进行修改,但是毕竟也是以前的一个印记。这次就在上那篇文章的基础上,试图让整个流程更加清楚,增加一些新内容,也会配上Demo的下载地址。

    另外,本Demo的开发环境是VS2017社区版+Qt 5.11.2,QtChart的添加方式和使用Qt Creator略有不同。(本人觉得开发大一点的项目还是VS方便,所以就一直使用的VS进行开发)

    为什么要写这片文章

    QtCharts常用的时间轴有QValueAxisQDateTimeAxis,有时候我们需要绘制与时间相关的数据,如与日期相关的天气数据,或者是随分钟变化的传感器数据等,这样就会用到 QDateTimeAxis 坐标轴目前网上的一些例子,以及QT自带的例子,基本都是和日期相关的数据,没有找到坐标轴是分钟、秒的案例,踩了一些坑后,写下这篇文章,希望能够帮助到需要的人。

    QtCharts折线图初始化设置

    UI设置

    记得在生成项目的时候勾选charts(安装Qt的时候记得也要安装这个组件),这样就能正常使用QtCharts,一路next就可以生成我们的项目了。
    在这里插入图片描述
    我们要实现折线图需要利用QChartView,在QChartView中才可以添加QChart。
    双击ui文件打开QtDesigner,我们会发现没有现成的QChartView控件。但是问题不大,QChartView是继承于GraphicsView的,所以我们可以通过Qt的一些操作,将GraphicsView变为我们要使用的QChartView
    首先我们拖动一个GraphicsView到右边去,对着添加进去的控件右键,选择提升,然后在弹出窗口,进行下面的操作,确定后我们就可以得到一个QChartView了。

    在这里插入图片描述
    可以看到,右边属性界面我们的graphicsView的类就变为了QChartView
    在这里插入图片描述
    这个时候我们进行编译,是会报错的,大概就是下面这个样子
    在这里插入图片描述
    需要在头文件中添加一个包含,就可以正常使用了
    在这里插入图片描述


    折线图初始化

    主要是初始化坐标轴和数据集,以及QChart对象。(我们这里既有左边的Y轴,又有右边的Y轴,如果只是想显示普通一条数据,只需要一个Y轴就可以了)

    m_AxisX_Time = new QDateTimeAxis();//时间轴    
    m_AxisY_Left = new QValueAxis();//左边Y轴    
    m_AxisY_Right = new QValueAxis();//右边Y轴    
    m_LeftSeries = new QLineSeries();//折线图数据集    
    m_RightSeries = new QLineSeries();    
    m_LineChart = new QChart();//chart对象
    

    其中这个m_LineChart是要添加到我们QChartView中的具体对象,也是折线图的具体对象。
    有了这些对象,我们需要对他们之间进行初始设置,添加他们之间的关系,让他们能够各司其职,共同工作。


    首先就是把我们的数据集加入到我们的chart中

     //添加曲线到chart中    
     m_LineChart->addSeries(m_LeftSeries);    
     m_LineChart->addSeries(m_RightSeries);
    

    然后我们对坐标轴进行一定的设置。时间轴设置区间需要用到QDateTime,QDateTime是一个年月日,时分秒的时间类,构造函数是由年月日的m_BaseData对象(QDate类)和m_BaseTime对象(QTime类)组成,但是因为我们想要显示时分秒或者分秒,所以调用下面一句话,我们可以只是显示分秒。

    m_AxisX_Time->setFormat(“mm:ss”)

    具体的代码如下

    QDateTime temp_StartTime(m_BaseDate, m_BaseTime);//00:00    
    QDateTime temp_EndTime(m_BaseDate, m_EndTime);//02:00
    m_AxisX_Time->setTickCount(6);//分为六格    
    m_AxisX_Time->setRange(temp_StartTime, temp_EndTime);//时间显示范围
    //坐标轴显示方式: 分钟:秒    
    m_AxisX_Time->setFormat("mm:ss");
    //设置坐标轴显示范围    
    m_AxisY_Left->setRange(-900, 2000);    
    m_AxisY_Right->setRange(-900, 1500);
    
    • 这里有一个坑,QDateTime中,如果初始化输入QDateQTime时间不正确,那么理论上QDateTime也是错误的,但是系统是不会报错的,但会导致显示数据异常;
    • 比如QDate如果是(2000,0,1),不会提示错误,但是其实显示的数值会一直是错误的
    • 所以为了保证数据的正确性,这些容易出错的对象我们尽量用全局的const变量来提前定义,如m_BaseDate

    然后我们把设置好的坐标添加到chart中,和添加进数据集的方法相似

     //把坐标轴添加到chart中,    
     //addAxis函数的第二个参数是设置坐标轴的位置,    
     //只有四个选项,下方:Qt::AlignBottom,左边:Qt::AlignLeft,右边:Qt::AlignRight,上方:Qt::AlignTop    
     m_LineChart->addAxis(m_AxisX_Time, Qt::AlignBottom);    
     m_LineChart->addAxis(m_AxisY_Left, Qt::AlignLeft);    
     m_LineChart->addAxis(m_AxisY_Right, Qt::AlignRight);
    

    最后将数据集和坐标轴绑定。每个数据集都需要绑定X轴-时间轴和对应的Y轴,如果想要添加多条折线图,原理也是一样的,只需要绑定X轴和对应的Y轴就可以了。

    //把曲线关联到坐标轴    
    m_LeftSeries->attachAxis(m_AxisX_Time);    
    m_LeftSeries->attachAxis(m_AxisY_Left);    
    m_RightSeries->attachAxis(m_AxisX_Time);    
    m_RightSeries->attachAxis(m_AxisY_Right);
    

    到这里,我们的chart就设置完毕了,我们将设置好的chart添加进我们的chartView中就可以了

    ui.graphicsView->setChart(m_LineChart);
    

    往Chart中添加数据的方法

    想要往QtChart中添加数据,只需要往对应的数据集series中添加点,为了方便调用,这里写成了一个函数形式。

    /** 
    * 添添加一个点 
    * */
    void QtChartTimeAxis::addOnePointToChart(QLineSeries *targetSeries, int secondCount, int y_value) 
    {    
    QDateTime temp_AddTimePos(m_BaseDate, m_BaseTime.addSecs(secondCount));//通过addSecs增加秒数,更加安全    
    targetSeries->append(temp_AddTimePos.toMSecsSinceEpoch(), y_value);
    }
    

    定时器与绘制

    我们这里通过定时器,每一秒钟绘制一次数据点,这和我们期望的实际的工作方式是一致。

    //初始化一个定时器    
    m_DrawTimer = new QTimer(this);    
    connect(m_DrawTimer, &QTimer::timeout, this, &QtChartTimeAxis::oneSecondAction);//槽函数,每次定时器达到指定时间就执行一次
    

    开始定时器只需要执行下面这一行,括号内这个间隔单位是ms,可以按照自己的要求进行更改。

    m_DrawTimer->start(1000);//1秒执行一次
    

    然后在每秒响应的槽函数中,每一秒调用一次addOnePointToChart函数,

    second_count++;
    addOnePointToChart(m_LeftSeries, second_count, m_DataList[second_count].toInt());
    

    其他

    设置坐标轴样式的函数,

    可以设置左右Y轴的颜色,名称,以及让曲线颜色和Y轴颜色一致。因为不是非常重要,就放在了最后

    /** 
    * 设置坐标轴样式 
    * */
    void QtChartTimeAxis::setAxisFormat(QValueAxis *axis, QXYSeries *lineSeries, QString titleString, QColor color)
    { 
    axis->setTitleText(titleString); 
    axis->setTitleFont(QFont("黑体", 8, QFont::Medium, false)); 
    axis->setTitleBrush(color); 
    axis->setLinePenColor(color); 
    lineSeries->setPen(QPen(color, 0.6, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin));}
    

    设置折线图边距

    同样的,因为不是非常重要,就放在了最后。但是有时候可能会对边距有要求。

    /** * 用于设置折线图边距 */ 
    void QtChartTimeAxis::setLineChartMargins(QChart *chart, int margin) 
    { 
    QMargins m_Margin; 
    m_Margin.setLeft(margin); 
    m_Margin.setBottom(margin); 
    m_Margin.setRight(margin); 
    m_Margin.setTop(margin); 
    chart->setMargins(m_Margin); 
    }
    

    下载

    下载 程序及数据下载连接

    说明:程序提供的下载(本程序是利用VS2017+Qt 5.11.2进行编写,建议用相同环境打开)

    相关

    QtChart还是适合轻量级的应用,比如这个Demo是1s绘制一次,所以性能上没有一点问题,100ms也不会有什么问题,但是10ms的绘制间隙后,系统明显会卡顿了,这对系统执行的其他任务影响很大,这个时候就需要自定义的绘制模块了。

    展开全文
  • 文章目录QtCharts 添加时间坐标轴正式操作根据定时器动态绘制添加一个定时器设置每秒的任务添加一个点的函数 QtCharts 添加时间坐标轴 添加的轴可以有两种 一种是QValueAxis 另外一种就是我们需要的QDateTimeAxis ...

    注意!

    文章已经进行修改,结构逻辑更加清晰,查看最新的文章和Demo资源请移步↓
    新-QtCharts时间坐标轴,利用定时器动态绘制图
    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    QtCharts 添加时间坐标轴

    QtCharts坐标轴说明

    QtCharts 的坐标轴主要有两种,一种是QValueAxis 另外一种就是我们需要的QDateTimeAxis
    有时候我们需要绘制与时间相关的数据,如与日期相关的天气数据,或者是随分钟变化的传感器数据等,这样就会用到 QDateTimeAxis 坐标轴
    目前网上的一些例子,以及QT自带的例子,基本都是和日期相关的数据,没有找到坐标轴是分钟、秒的案例。
    踩了一些坑后,写下这篇文章,希望能够帮助到需要的人。

    QtCharts初始化操作

    如果将来要对x轴时间范围、或者是y轴的范围进行调整,建议在头文件中声明x轴

    QDateTimeAxis *axisX_Time ;
    QValueAxis *axisY_Data;//数据点
    

    然后在折线图中初始化,绑定数据集,就完成了折线图的初始化

    axisX_Time = new QDateTimeAxis(this);//时间轴
    axisY_Data= new QValueAxis();//数据点
    
    //QDateTimeAxis需要QDateTime的数值格式
    QDateTime temp_StartTime(QDate(2000, 1, 1), QTime(0, 0, 0)); //前面是年月日,后面是小时、分钟、秒
    QDateTime temp_EndTime(QDate(2000, 1, 1), QTime(0, 20, 0));//
    axisX_Time->setTickCount(5);//设置显示的时间个数
    axisX_Time->setRange(temp_StartTime, temp_EndTime);//设置显示范围
    
    //坐标轴显示方式: 分钟:秒
    axisX_Time->setFormat("mm:ss");//如果需要其他时间也可以进行修改
    
    axisY_Data->setRange(0,200);
    //最后绑定数据即可
    dataSeries->attachAxis(axisX_Time);
    dataSeries->attachAxis(axisY_Data);
    
    • 这里有一个坑,就是关于QDateTime的,如果初始化输入QDateQTime时间不正确,那么QDateTime也是错误的,并且不会报错;
    • 比如QDate如果是(2000,0,1),不会提示错误,但是其实显示的数值会一直是错误的

    根据定时器动态添加点

    为了实现传感器数据随时间的变化,每秒进行绘制,需要添加一个定时器,设置1s的任务,往chart中添加一个数据。

    添加一个定时器

        timeCount = 0;//在头文件中添加一个全局变量,记录秒数
    	myTimer = new QTimer(this);
    	connect(myTimer , SIGNAL(timeout()), this, SLOT(oneSecondAction()));//连接定时器时间到达响应的槽函数
    	myTimer ->start(1000);//1000ms之行一次
    	//定时器还有一些函数,可以时时间间隔更为精确
    

    设置每秒的任务

    //定期器启动后,1s执行一次的任务
    void MyWidget::oneSecondAction() {
    	//*******  每秒绘制折线图一次 *******
    	addOnePointToChart(dataSeries, timeCount, addData);//addData来自于传感器赋值的数据
    	timeCount++;//秒数+1
    }
    

    在chart上添加一个点

    • 方法一,这是之前的一种方法,将秒数手动转为时分秒形式
    //在折线图上添加一个点
    //输入参数说明
    //targetSeries:目标曲线集
    //secondCount:秒数。即数据添加的横坐标
    //y_value:数据的大小
    void MyWidget::addOnePointToChart(QLineSeries *targetSeries, int secondCount, int y_value) {
    
    	int second, hour, minute;
    	second = secondCount; 
    	MyHelper::changeTimeFromSecond(&hour, &minute, &second);//转换为标准的时分秒,保证QTime不会出错
    	QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(hour, minute, second));//生成一个坐标轴时间QDateTime
    
    	targetSeries->append(temp_AddTimePos.toMSecsSinceEpoch(), y_value);
    
    }
    

    将秒数转换为时分秒的函数

    	static void changeTimeFromSecond(int *hour, int *minute, int *second) {
    
    		*hour = *second / 3600;
    		*minute = (*second - *hour * 3600) / 60;
    		*second -= *hour * 3600 + *minute * 60;
    	}
    
    • 方法二利用addSecs()函数更加简单
    
    void MyWidget::addOnePointToChart(QLineSeries *targetSeries, int secondCount, int y_value) {
    
    	QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(0, 0, 0).addSecs(secondCount));//生成一个坐标轴时间QDateTime
    	targetSeries->append(temp_AddTimePos.toMSecsSinceEpoch(), y_value);
    
    }
    
    

    如果坐标轴发现时间从分钟变成了小时,需要对坐标轴进行一下修改

    //坐标轴显示方式: 小时:分钟:秒
    axisX_Time->setFormat("hh:mm:ss");
    

    其他

    展开全文
  • Qt 坐标轴控件

    热门讨论 2013-05-07 23:45:15
    该控件继承QWidget, 实现了左右... /** @brief 设置坐标轴绘制范围, 像素值 */ void setBoundary(int left, int right, int top, int bottom); void getBoundary(int& left, int& right, int& top, int& bottom);
  • 1.首先是掌握qtchart的基本使用,封装一个属于自己的绘图类: Mychart.h #pragma once #ifndef CHART_H #define CHART_H #include &lt;QtCharts/QChart&gt; #include&lt;QtCharts\QChartView&gt; ...
  • 1、创建QT GUI应用,基类...
  • //为序列设置坐标轴 chart->setAxisX(axisX, series0); chart->setAxisY(axisY, series0); chart->setAxisX(axisX, series1); chart->setAxisY(axisY, series1);   转载于:...
  • 1、创建QT GUI应用,基类选择"QMainWindows",在.pro中添加: QT += charts 在源文件中添加: #include<QCharts> 2、在构造函数中添加: QChartView *chartView = new QChartView(this); QChartView *...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 122
精华内容 48
关键字:

qt绘制坐标轴