Qt(C++)使用QChart动态显示3个设备的温度变化曲线

简介: Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

一、介绍

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

QChart支持多种类型的图表,包括折线图、散点图、柱状图、饼图等。它还支持多个数据系列(datasets)在同一个图表中显示,并且可以自定义各种图表属性和样式,如坐标轴标签、标题、图例等。

QChart还支持多种数据源(data sources),可以来自Qt的数据模型(data models)、CSV文件、JSON文件等。数据源可以是任何支持迭代器(iterator)的类型,因此可以轻松地与其他Qt组件集成。

使用QChart可以轻松地创建交互式图表,如鼠标悬停提示(hover tooltip)、数据选择(data selection)等。此外,QChart还支持多种主题(themes)和自定义CSS样式,使得图表外观可以灵活地定制。

out

image-20230529143347595

image-20230529143404140

二、实现代码(1)QMainWindow

以下是使用Qt(C++)的QChart模块显示3个设备的动态温度曲线的代码实现:

【1】实现温度动态更新

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts/QChart>
#include <QtCharts/QLineSeries>
#include <QTimer>

QT_CHARTS_USE_NAMESPACE

namespace Ui {
   
   
class MainWindow;
}

class MainWindow : public QMainWindow
{
   
   
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void updateChartData(); // 更新数据槽函数

private:
    Ui::MainWindow *ui;
    QTimer *m_timer; // 定时器

    QChart *m_chart; // 图表指针

    QLineSeries *m_series1; // 设备1温度曲线
    QLineSeries *m_series2; // 设备2温度曲线
    QLineSeries *m_series3; // 设备3温度曲线

    int m_timeCount; // 时间计数
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_timer(new QTimer(this)),
    m_chart(new QChart()),
    m_series1(new QLineSeries()),
    m_series2(new QLineSeries()),
    m_series3(new QLineSeries()),
    m_timeCount(0)
{
   
   
    ui->setupUi(this);

    // 设置图表标题
    m_chart->setTitle("Temperature Data");

    // 创建温度曲线图1并设置属性
    m_series1->setName(tr("Device 1"));
    m_series1->setColor(Qt::red);
    m_series1->setPen(QPen(Qt::red, 2));
    m_chart->addSeries(m_series1);

    // 创建温度曲线图2并设置属性
    m_series2->setName(tr("Device 2"));
    m_series2->setColor(Qt::green);
    m_series2->setPen(QPen(Qt::green, 2));
    m_chart->addSeries(m_series2);

    // 创建温度曲线图3并设置属性
    m_series3->setName(tr("Device 3"));
    m_series3->setColor(Qt::blue);
    m_series3->setPen(QPen(Qt::blue, 2));
    m_chart->addSeries(m_series3);

    // 设置横轴属性
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0, 30);
    axisX->setTitleText("Time (s)");
    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series1->attachAxis(axisX);
    m_series2->attachAxis(axisX);
    m_series3->attachAxis(axisX);

    // 设置纵轴属性
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0, 60);
    axisY->setTitleText("Temperature (℃)");
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series1->attachAxis(axisY);
    m_series2->attachAxis(axisY);
    m_series3->attachAxis(axisY);

    // 定时更新数据
    connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
    m_timer->start(1000); // 每隔1秒钟更新一次数据

    // 将图表添加到ChartView中
    ui->chartView->setChart(m_chart);
    ui->chartView->setRenderHint(QPainter::Antialiasing);
}

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

void MainWindow::updateChartData()
{
   
   
    // 更新时间计数
    m_timeCount++;

    // 在温度曲线上增加一个点,模拟温度数据变化
    QPointF p1(m_timeCount, qrand() % 10 + 20);
    QPointF p2(m_timeCount, qrand() % 10 + 30);
    QPointF p3(m_timeCount, qrand() % 10 + 40);
    m_series1->append(p1);
    m_series2->append(p2);
    m_series3->append(p3);

    // 清除多余的点,只保留最新的30个数据点
    if (m_series1->count() > 30) {
   
   
        m_series1->removePoints(0, 1);
    }
    if (m_series2->count() > 30) {
   
   
        m_series2->removePoints(0, 1);
    }
    if (m_series3->count() > 30) {
   
   
        m_series3->removePoints(0, 1);
    }
}

在此代码中,定义了一个QTimer定时器对象,用于每隔一段时间更新温度曲线数据。在定时器的timeout信号触发时,调用updateChartData()槽函数来更新温度曲线数据,同时控制数据量不超过30个点。

在updateChartData()函数中,使用了qrand()函数来生成随机的温度数据,模拟动态变化的效果。可以根据实际情况修改此函数的实现方式。

最后,将图表添加到QChartView控件中,并启用抗锯齿功能以提高显示质量。

【2】设置曲线可见范围

为了保证曲线显示一直在可见范围内,可以添加如下代码:

// 使图表自适应大小,确保曲线始终可见
m_chart->createDefaultAxes();
m_chart->axisX()->setRange(0, 30);
m_chart->axisY()->setRange(0, 60);

这段代码的作用是让图表自适应大小,并设置横轴范围为0到30,纵轴范围为0到60。这样当新数据点增加到图表之外时,图表会自动调整大小和范围,以确保曲线始终可见。

完整的mainwindow.cpp代码如下所示:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_timer(new QTimer(this)),
    m_chart(new QChart()),
    m_series1(new QLineSeries()),
    m_series2(new QLineSeries()),
    m_series3(new QLineSeries()),
    m_timeCount(0)
{
   
   
    ui->setupUi(this);

    // 设置图表标题
    m_chart->setTitle("Temperature Data");

    // 创建温度曲线图1并设置属性
    m_series1->setName(tr("Device 1"));
    m_series1->setColor(Qt::red);
    m_series1->setPen(QPen(Qt::red, 2));
    m_chart->addSeries(m_series1);

    // 创建温度曲线图2并设置属性
    m_series2->setName(tr("Device 2"));
    m_series2->setColor(Qt::green);
    m_series2->setPen(QPen(Qt::green, 2));
    m_chart->addSeries(m_series2);

    // 创建温度曲线图3并设置属性
    m_series3->setName(tr("Device 3"));
    m_series3->setColor(Qt::blue);
    m_series3->setPen(QPen(Qt::blue, 2));
    m_chart->addSeries(m_series3);

    // 设置横轴属性
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0, 30);
    axisX->setTitleText("Time (s)");
    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series1->attachAxis(axisX);
    m_series2->attachAxis(axisX);
    m_series3->attachAxis(axisX);

    // 设置纵轴属性
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0, 60);
    axisY->setTitleText("Temperature (℃)");
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series1->attachAxis(axisY);
    m_series2->attachAxis(axisY);
    m_series3->attachAxis(axisY);

    // 使图表自适应大小,确保曲线始终可见
    m_chart->createDefaultAxes();
    m_chart->axisX()->setRange(0, 30);
    m_chart->axisY()->setRange(0, 60);

    // 定时更新数据
    connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
    m_timer->start(1000); // 每隔1秒钟更新一次数据

    // 将图表添加到ChartView中
    ui->chartView->setChart(m_chart);
    ui->chartView->setRenderHint(QPainter::Antialiasing);
}

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

void MainWindow::updateChartData()
{
   
   
    // 更新时间计数
    m_timeCount++;

    // 在温度曲线上增加一个点,模拟温度数据变化
    QPointF p1(m_timeCount, qrand() % 10 + 20);
    QPointF p2(m_timeCount, qrand() % 10 + 30);
    QPointF p3(m_timeCount, qrand() % 10 + 40);
    m_series1->append(p1);
    m_series2->append(p2);
    m_series3->append(p3);

    // 清除多余的点,只保留最新的30个数据点
    if (m_series1->count() > 30) {
   
   
        m_series1->removePoints(0, 1);
    }
    if (m_series2->count() > 30) {
   
   
        m_series2->removePoints(0, 1);
    }
    if (m_series3->count() > 30) {
   
   
        m_series3->removePoints(0, 1);
    }
}

【3】实现鼠标交互拖动

要实现折线图的横坐标可以拖动,可以设置QChartView的交互模式为拖拽,在构造函数中添加如下代码:

// 设置 ChartView 交互模式为拖拽
ui->chartView->setRubberBand(QChartView::HorizontalRubberBand);
ui->chartView->setRenderHint(QPainter::Antialiasing);
ui->chartView->setDragMode(QGraphicsView::ScrollHandDrag);

这样用户就可以通过鼠标左键在横轴上拖拽来改变曲线图的可见范围。同时,还需要在mainwindow.cpp中添加横坐标的范围更新函数updateAxisRange(),用于在拖拽时更新横坐标的范围。

完整的mainwindow.cpp代码如下所示:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_timer(new QTimer(this)),
    m_chart(new QChart()),
    m_series1(new QLineSeries()),
    m_series2(new QLineSeries()),
    m_series3(new QLineSeries()),
    m_timeCount(0)
{
   
   
    ui->setupUi(this);

    // 设置图表标题
    m_chart->setTitle("Temperature Data");

    // 创建温度曲线图1并设置属性
    m_series1->setName(tr("Device 1"));
    m_series1->setColor(Qt::red);
    m_series1->setPen(QPen(Qt::red, 2));
    m_chart->addSeries(m_series1);

    // 创建温度曲线图2并设置属性
    m_series2->setName(tr("Device 2"));
    m_series2->setColor(Qt::green);
    m_series2->setPen(QPen(Qt::green, 2));
    m_chart->addSeries(m_series2);

    // 创建温度曲线图3并设置属性
    m_series3->setName(tr("Device 3"));
    m_series3->setColor(Qt::blue);
    m_series3->setPen(QPen(Qt::blue, 2));
    m_chart->addSeries(m_series3);

    // 设置横轴属性
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0, 30);
    axisX->setTitleText("Time (s)");
    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series1->attachAxis(axisX);
    m_series2->attachAxis(axisX);
    m_series3->attachAxis(axisX);

    // 设置纵轴属性
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0, 60);
    axisY->setTitleText("Temperature (℃)");
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series1->attachAxis(axisY);
    m_series2->attachAxis(axisY);
    m_series3->attachAxis(axisY);

    // 使图表自适应大小,确保曲线始终可见
    m_chart->createDefaultAxes();
    m_chart->axisX()->setRange(0, 30);
    m_chart->axisY()->setRange(0, 60);

    // 设置 ChartView 交互模式为拖拽
    ui->chartView->setRubberBand(QChartView::HorizontalRubberBand);
    ui->chartView->setRenderHint(QPainter::Antialiasing);
    ui->chartView->setDragMode(QGraphicsView::ScrollHandDrag);

    // 定时更新数据
    connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
    m_timer->start(1000); // 每隔1秒钟更新一次数据

    // 将图表添加到ChartView中
    ui->chartView->setChart(m_chart);
}

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

void MainWindow::updateChartData()
{
   
   
    // 更新时间计数
    m_timeCount++;

    // 在温度曲线上增加一个点,模拟温度数据变化
    QPointF p1(m_timeCount, qrand() % 10 + 20);
    QPointF p2(m_timeCount, qrand() % 10 + 30);
    QPointF p3(m_timeCount, qrand() % 10 + 40);
    m_series1->append(p1);
    m_series2->append(p2);
    m_series3->append(p3);

    // 清除多余的点,只保留最新的30个数据点
    if (m_series1->count() > 30) {
   
   
        m_series1->removePoints(0, 1);
    }
    if (m_series2->count() > 30) {
   
   
        m_series2->removePoints(0, 1);
    }
    if (m_series3->count() > 30) {
   
   
        m_series3->removePoints(0, 1);
    }

    // 更新横轴范围
    updateAxisRange();
}

void MainWindow::updateAxisRange()
{
   
   
    // 获取横轴范围
    qreal minX = std::numeric_limits<qreal>::max();
    qreal maxX = std::numeric_limits<qreal>::min();
    foreach (QAbstractSeries *series, m_chart->series()) {
   
   
        QXYSeries *xySeries = static_cast<QXYSeries*>(series);
        QPointF p1 = xySeries->at(0);
        QPointF p2 = xySeries->at(xySeries->count() - 1);

        if (p1.x() < minX) {
   
   
            minX = p1.x();
        }
        if (p2.x() > maxX) {
   
   
            maxX = p2.x();
        }
    }

    // 更新横轴范围
    m_chart->axisX()->setRange(minX, maxX);
}

为了更新横坐标的范围,需要在MainWindow中添加了一个新函数updateAxisRange()。该函数会在数据更新时被调用来计算最新的横轴范围,以更新折线图的显示。

三、实现代码(2)QWidget

当前这份完整代码实现了一个动态折线图的绘制,是一个典型的Qt Charts应用程序。通过使用QLineSeries类、QValueAxis类和QChart类来创建并显示温度随时间变化的折线图。

第一步:先创建了主窗口,其中包含一个QChartView控件,用于显示温度曲线图。在构造函数中,设置了一些基本属性,比如标题、横纵坐标的范围和名称等,并为每个设备创建了一个QLineSeries对象,用于存储温度数据。

第二步:将这些QLineSeries对象添加到QChart对象中。接着,将QValueAxis对象添加到QChart中,设置其范围和名称,并将QLineSeries对象与其关联。最后,将QChart对象添加到QChartView中,以便在界面上显示折线图。

第三步:在updateChartData()函数中,定时器每隔1秒钟触发一次,用于更新温度数据,并通过调用QLineSeries类的append()函数向QLineSeries对象中添加新的温度数据点。同时,使用removePoints()函数删除旧的数据点,以保持折线图中显示的数据点不超过30个。在添加或删除数据时,使用updateAxisRange()函数更新横坐标的范围,以便将折线图自适应地缩放到当前数据范围内。

第四步:重载了updateAxisRange()函数,根据QLineSeries对象的数据点计算出横坐标的最小值和最大值,并通过调用QChart类的axisX()->setRange()函数更新QValueAxis对象的范围。

【1】widget.cpp代码

#include "widget.h"
#include "ui_widget.h"

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

    this->setWindowTitle("温度数据可视化采集系统");

    m_timer=new QTimer(this);
    m_chart=new QChart();

    m_series1=new QLineSeries();
    m_series2=new QLineSeries();
    m_series3=new QLineSeries();

    m_timeCount=0;

    // 创建温度曲线图1并设置属性
    m_series1->setName(tr("设备1"));
//    m_series1->setColor(Qt::red);
//    m_series1->setPen(QPen(Qt::red, 2));
    m_chart->addSeries(m_series1);

    // 创建温度曲线图2并设置属性
    m_series2->setName(tr("设备2"));
//    m_series2->setColor(Qt::green);
//    m_series2->setPen(QPen(Qt::green, 2));
    m_chart->addSeries(m_series2);

    // 创建温度曲线图3并设置属性
    m_series3->setName(tr("设备3"));
//    m_series3->setColor(Qt::blue);
//    m_series3->setPen(QPen(Qt::blue, 2));
    m_chart->addSeries(m_series3);

    // 设置横轴属性
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0, 30);
    axisX->setTitleText("时间 (s)");
    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series1->attachAxis(axisX);
    m_series2->attachAxis(axisX);
    m_series3->attachAxis(axisX);

    // 设置纵轴属性
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0, 60);
    axisY->setTitleText("温度 (℃)");
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series1->attachAxis(axisY);
    m_series2->attachAxis(axisY);
    m_series3->attachAxis(axisY);

    // 使图表自适应大小,确保曲线始终可见
      m_chart->createDefaultAxes();
      m_chart->axisX()->setRange(0, 30);
      m_chart->axisY()->setRange(0, 60);


    // 定时更新数据
    connect(m_timer, &QTimer::timeout, this, &Widget::updateChartData);

    // 将图表添加到ChartView中
    QChartView* chartView = new QChartView(m_chart);

    // 设置 ChartView 交互模式为拖拽
    chartView->setRubberBand(QChartView::HorizontalRubberBand);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setDragMode(QGraphicsView::ScrollHandDrag);

    chartView->setRenderHint(QPainter::Antialiasing);

    //将视图添加到布局
    ui->view_verticalLayout->addWidget(chartView);
}



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


void Widget::updateChartData()
{
   
   
    // 更新时间计数
    m_timeCount++;

    // 在温度曲线上增加一个点,模拟温度数据变化
    QPointF p1(m_timeCount, qrand() % 10 + 20);
    QPointF p2(m_timeCount, qrand() % 10 + 30);
    QPointF p3(m_timeCount, qrand() % 10 + 40);
    m_series1->append(p1);
    m_series2->append(p2);
    m_series3->append(p3);

    // 清除多余的点,只保留最新的30个数据点
    if (m_series1->count() > 30) {
   
   
        m_series1->removePoints(0, 1);
    }
    if (m_series2->count() > 30) {
   
   
        m_series2->removePoints(0, 1);
    }
    if (m_series3->count() > 30) {
   
   
        m_series3->removePoints(0, 1);
    }

    // 更新横轴范围
    updateAxisRange();
}


void Widget::updateAxisRange()
{
   
   
    // 获取横轴范围
    qreal minX = std::numeric_limits<qreal>::max();
    qreal maxX = std::numeric_limits<qreal>::min();
    foreach (QAbstractSeries *series, m_chart->series()) {
   
   
        QXYSeries *xySeries = static_cast<QXYSeries*>(series);
        QPointF p1 = xySeries->at(0);
        QPointF p2 = xySeries->at(xySeries->count() - 1);

        if (p1.x() < minX) {
   
   
            minX = p1.x();
        }
        if (p2.x() > maxX) {
   
   
            maxX = p2.x();
        }
    }

    // 更新横轴范围
    m_chart->axisX()->setRange(minX, maxX);
}



//开始采集
void Widget::on_pushButton_start_clicked()
{
   
   
    m_timer->start(1000); // 每隔1秒钟更新一次数据
}


//停止采集
void Widget::on_pushButton_stop_clicked()
{
   
   
    m_timer->stop(); //停止定时器
}

【2】widget.h代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

// 包含line chart需要的头文件
#include <QtCharts/QChart>
#include <QtCharts/QLineSeries>
#include <QtCharts/QChartView>
#include <QtCore/QRandomGenerator>
#include <QValueAxis>
#include <QScatterSeries>
#include <QTimer>

// 引用命名空间
QT_CHARTS_USE_NAMESPACE

QT_BEGIN_NAMESPACE
namespace Ui {
   
    class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
   
   
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void updateChartData(); // 更新数据槽函数
    void updateAxisRange();

    void on_pushButton_start_clicked();

    void on_pushButton_stop_clicked();

private:
    Ui::Widget *ui;

    QTimer *m_timer; // 定时器

    QChart *m_chart; // 图表指针

    QLineSeries *m_series1; // 设备1温度曲线
    QLineSeries *m_series2; // 设备2温度曲线
    QLineSeries *m_series3; // 设备3温度曲线

    int m_timeCount; // 时间计数
};
#endif // WIDGET_H

【3】UI文件代码

image-20230529143214460

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>600</width>
    <height>444</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QWidget" name="widget" native="true">
     <property name="minimumSize">
      <size>
       <width>100</width>
       <height>100</height>
      </size>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout_2">
      <property name="spacing">
       <number>0</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
       <layout class="QVBoxLayout" name="view_verticalLayout"/>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QWidget" name="widget_2" native="true">
     <property name="maximumSize">
      <size>
       <width>16777215</width>
       <height>40</height>
      </size>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="spacing">
       <number>0</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
       <widget class="QPushButton" name="pushButton_start">
        <property name="text">
         <string>开始采集</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_stop">
        <property name="text">
         <string>停止采集</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

【4】pro工程文件

QT       += core gui
QT       += charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/{
   
   mathJaxContainer[0]}{
   
   TARGET}/bin
!isEmpty(target.path): INSTALLS += target
目录
相关文章
|
2月前
|
安全 网络协议 数据安全/隐私保护
掌握Qt和C++:构建你的第一个P2P应用程序
掌握Qt和C++:构建你的第一个P2P应用程序
153 3
|
2月前
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
225 3
|
1天前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
9 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3天前
|
数据可视化 开发者 C++
Qt(C++)使用QChart静态显示3个设备的温度变化曲线
QChart模块是Qt Charts库的基础,提供了用于创建和显示各种类型图表的类和接口。Qt Charts库是一个功能丰富、易于使用的数据可视化工具库,可以帮助开发者在应用程序中添加漂亮而又交互性强的图表。
14 1
Qt(C++)使用QChart静态显示3个设备的温度变化曲线
|
29天前
|
数据处理 开发工具 C++
Qt C++ 扫码枪使用数据处理
Qt C++ 扫码枪使用数据处理
|
2月前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
83 3
|
2月前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
63 1
|
1天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
1天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
1天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。

热门文章

最新文章