[C/C++]QT编写静态动态曲线图静态动态柱状图

来源:本网整理

MFC是微软的为windows设计的,以包装windowsapi为主要目的而存在的C++开发库,它不是单纯的GUI库,其中仍然封装了不少windows平台独有的特性和方法,闭源,不可抑制。但是大多数windows下的C++程序仍然使用MFC去编写,毕竟对windows有更好的适应

QT编写静态动态曲线图静态动态柱状图,可以将数据转换为静态曲线和动态曲线及柱状图显示。 scrolltotop.offset(100,120); scrolltotop.init();

[1].[代码] [C/C++]代码 跳至 [1] [2] [3] [4] [5] [6]

#ifndef FRMMAIN_H #define FRMMAIN_H #include <QWidget> #include "qcustomplot.h" namespace Ui { class frmMain; } class frmMain : public QWidget { Q_OBJECT public: explicit frmMain(QWidget *parent = 0); ~frmMain(); private slots: void LoadPlot1(); void LoadPlot2(); void LoadPlot3(); void LoadPlot4(); void LoadPlot5(); void UpdatePlot5(); void on_btnLoad_clicked(); void on_btnSkin_clicked(); void on_ckText_stateChanged(int arg1); void on_ckBackground_stateChanged(int arg1); void on_ckMove_stateChanged(int arg1); void on_tabWidget_currentChanged(int index); private: Ui::frmMain *ui; QTimer *plot2_timer; QTimer *plot5_timer; int currentIndex; QString currentSkin; QList <QCustomPlot *> plots; QVector<double> plot1_keys; QVector<double> plot1_values; double plot2_key; double plot2_value; QVector<double> plot3_keys; QVector<double> plot3_values1, plot3_values2, plot3_values3; QVector<QString> plot3_labels; QVector<QCPBars *> plot3_Bar; QVector<double> plot4_keys; QVector<double> plot4_values; QVector<QString> plot4_labels; QVector<QCPBars *> plot4_Bar; QVector<double> plot5_keys; QVector<double> plot5_values; QVector<double> plot5_currentValue; int maxValue; QVector<QString> plot5_labels; QVector<QCPBars *> plot5_Bar; void InitStyle(); void InitForm(); void InitPlot(); void InitPlot1(); void InitPlot2(); void InitPlot3(); void InitPlot4(); void InitPlot5(); }; #endif // FRMMAIN_H

[2].[代码] [C/C++]代码 跳至 [1] [2] [3] [4] [5] [6]

基础篇 C语言这好像不用想,必须学的。C++语言:配合对OO的学习,也是必须的。刚开始接触C/C++时,如果是学校开了C/C++课程的话那就更好了,可以跟着老师的进度学习,在课余时间可以多做一些习题或上机练习。 如果你是完全自学,你可以找一本面向

#include "frmmain.h" #include "ui_frmmain.h" #include "myhelper.h" #include "iconhelper.h" #define TextColor QColor(255,255,255) #define Plot_NoColor QColor(0,0,0,0) #define Plot1_DotColor QColor(5,189,251) #define Plot1_LineColor QColor(41,138,220) #define Plot1_BGColor QColor(41,138,220,80) #define Plot2_DotColor QColor(236,110,0) #define Plot2_LineColor QColor(246,98,0) #define Plot2_BGColor QColor(246,98,0,80) #define Plot3_AlarmColor1 QColor(204,0,0) #define Plot3_AlarmColor1X QColor(204,0,0,200) #define Plot3_AlarmColor2 QColor(246,98,0) #define Plot3_AlarmColor2X QColor(246,98,0,200) #define Plot3_AlarmColor3 QColor(41,138,220) #define Plot3_AlarmColor3X QColor(41,138,220,200) #define Plot4_AlarmColor1 QColor(238,0,0) #define Plot4_AlarmColor1X QColor(238,0,0,200) #define Plot4_AlarmColor2 QColor(204,250,255) #define Plot4_AlarmColor2X QColor(204,250,255,200) #define Plot4_AlarmColor3 QColor(5,189,251) #define Plot4_AlarmColor3X QColor(5,189,251,200) #define Plot4_AlarmColor4 QColor(236,110,0) #define Plot4_AlarmColor4X QColor(236,110,0,200) #define Plot4_AlarmColor5 QColor(106,139,34) #define Plot4_AlarmColor5X QColor(106,139,34,200) #define Plot4_AlarmColor6 QColor(99,149,236) #define Plot4_AlarmColor6X QColor(99,149,236,200) #define Plot4_AlarmColor7 QColor(130,111,255) #define Plot4_AlarmColor7X QColor(130,111,255,200) #define Plot4_AlarmColor8 QColor(205,173,0) #define Plot4_AlarmColor8X QColor(205,173,0,200) #define Plot4_AlarmColor9 QColor(1,139,0) #define Plot4_AlarmColor9X QColor(1,139,0,200) #define TextWidth 1 #define LineWidth 2 #define DotWidth 10 #define Plot1_Count 20 #define Plot2_Count 5 #define Plot3_Count 7 #define Plot4_Count 9 #define Plot5_Count 9 #define Plot1_MaxY 50 #define Plot2_MaxY 100 #define Plot3_MaxY 500 #define Plot4_MaxY 100 #ifdef __arm__ #define Plot5_MaxY 20 #else #define Plot5_MaxY 50 #endif frmMain::frmMain(QWidget *parent) : QWidget(parent), ui(new Ui::frmMain) { ui->setupUi(this); this->InitStyle(); this->InitForm(); this->InitPlot(); this->InitPlot1(); this->InitPlot2(); this->InitPlot3(); this->InitPlot4(); this->InitPlot5(); this->LoadPlot1(); this->LoadPlot2(); this->LoadPlot3(); this->LoadPlot4(); this->LoadPlot5(); plot5_timer->start(0); } frmMain::~frmMain() { delete ui; } void frmMain::InitStyle() { this->setProperty("Form", true); this->setWindowTitle(ui->lab_Title->text()); this->setGeometry(qApp->desktop()->availableGeometry()); this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); IconHelper::Instance()->SetIcon(ui->lab_Ico, QChar(0xf012)); IconHelper::Instance()->SetIcon(ui->btnMenu_Close, QChar(0xf00d)); connect(ui->btnMenu_Close, SIGNAL(clicked()), this, SLOT(close())); } void frmMain::InitForm() { currentIndex = 0; currentSkin = ":/image/dev.css"; //初始化随机数种子 QTime time = QTime::currentTime(); qsrand(time.msec() + time.second() * 1000); //初始化动态曲线定时器 plot2_timer = new QTimer(this); connect(plot2_timer, SIGNAL(timeout()), this, SLOT(LoadPlot2())); //初始化动态柱状图定时器 plot5_timer = new QTimer(this); connect(plot5_timer, SIGNAL(timeout()), this, SLOT(UpdatePlot5())); plots.append(ui->plot1); plots.append(ui->plot2); plots.append(ui->plot3); plots.append(ui->plot4); plots.append(ui->plot5); } void frmMain::InitPlot() { //设置纵坐标名称 plots[0]->yAxis->setLabel("力度值(单位:N)"); plots[1]->yAxis->setLabel("湿度值(单位:%)"); plots[2]->yAxis->setLabel("一周报警总数统计图"); plots[3]->yAxis->setLabel("报警数量统计图"); plots[4]->yAxis->setLabel("报警数量统计图"); //设置纵坐标范围 plots[0]->yAxis->setRange(0, Plot1_MaxY); plots[1]->yAxis->setRange(0, Plot2_MaxY); plots[2]->yAxis->setRange(0, Plot3_MaxY); plots[3]->yAxis->setRange(0, Plot4_MaxY); plots[4]->yAxis->setRange(0, Plot5_MaxY); foreach (QCustomPlot * plot, plots) { //设置坐标颜色/坐标名称颜色 plot->yAxis->setLabelColor(TextColor); plot->xAxis->setTickLabelColor(TextColor); plot->yAxis->setTickLabelColor(TextColor); plot->xAxis->setBasePen(QPen(TextColor, TextWidth)); plot->yAxis->setBasePen(QPen(TextColor, TextWidth)); plot->xAxis->setTickPen(QPen(TextColor, TextWidth)); plot->yAxis->setTickPen(QPen(TextColor, TextWidth)); plot->xAxis->setSubTickPen(QPen(TextColor, TextWidth)); plot->yAxis->setSubTickPen(QPen(TextColor, TextWidth)); //设置画布背景色 QLinearGradient plotGradient; plotGradient.setStart(0, 0); plotGradient.setFinalStop(0, 350); plotGradient.setColorAt(0, QColor(80, 80, 80)); plotGradient.setColorAt(1, QColor(50, 50, 50)); plot->setBackground(plotGradient); //设置坐标背景色 QLinearGradient axisRectGradient; axisRectGradient.setStart(0, 0); axisRectGradient.setFinalStop(0, 350); axisRectGradient.setColorAt(0, QColor(80, 80, 80)); axisRectGradient.setColorAt(1, QColor(30, 30, 30)); plot->axisRect()->setBackground(axisRectGradient); //设置图例提示位置及背景色 plot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignRight); plot->legend->setBrush(QColor(255, 255, 255, 200)); plot->replot(); } } void frmMain::InitPlot1() { plots[0]->addGraph(); plots[0]->graph(0)->setName("力度值(单位:N)"); plots[0]->graph(0)->setPen(QPen(Plot1_LineColor, LineWidth)); plots[0]->graph(0)->setScatterStyle( QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Plot1_DotColor, LineWidth), QBrush(Plot1_DotColor), DotWidth)); //设置静态曲线的横坐标范围及自适应横坐标 plots[0]->xAxis->setRange(0, Plot1_Count, Qt::AlignLeft); for (int i = 0; i < Plot1_Count; i++) { plot1_keys.append(i); } } void frmMain::InitPlot2() { plots[1]->addGraph(); plots[1]->graph(0)->setName("湿度值(单位:%)"); plots[1]->graph(0)->setPen(QPen(Plot2_LineColor, LineWidth)); plots[1]->graph(0)->setScatterStyle( QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Plot2_DotColor, LineWidth), QBrush(Plot2_DotColor), DotWidth)); //设置动态曲线的横坐标格式及范围 plots[1]->xAxis->setTickLabelType(QCPAxis::ltDateTime); plots[1]->xAxis->setDateTimeFormat("HH:mm:ss"); plots[1]->xAxis->setAutoTickStep(false); plots[1]->xAxis->setTickStep(0.5); plots[1]->xAxis->setRange(0, Plot2_Count, Qt::AlignRight); } void frmMain::InitPlot3() { //初始化横坐标名称 plot3_labels << "星期一" << "星期二" << "星期三"; plot3_labels << "星期四" << "星期五" << "星期六" << "星期日"; //创建三个柱状图形对象 for (int i = 0; i < 3; i++) { QCPBars *bar = new QCPBars(plots[2]->xAxis, plots[2]->yAxis); plot3_Bar.append(bar); plots[2]->addPlottable(plot3_Bar[i]); } //设置三个柱状图形对象名称 plot3_Bar[0]->setName("极其重要警情"); plot3_Bar[1]->setName("重要警情"); plot3_Bar[2]->setName("一般警情"); //分别对三个柱状图形对象设置颜色 QPen pen; pen.setWidthF(LineWidth); pen.setColor(Plot3_AlarmColor1); plot3_Bar[0]->setPen(pen); plot3_Bar[0]->setBrush(Plot3_AlarmColor1X); pen.setColor(Plot3_AlarmColor2); plot3_Bar[1]->setPen(pen); plot3_Bar[1]->setBrush(Plot3_AlarmColor2X); pen.setColor(Plot3_AlarmColor3); plot3_Bar[2]->setPen(pen); plot3_Bar[2]->setBrush(Plot3_AlarmColor3X); //设置柱状图形排列次序 plot3_Bar[1]->moveAbove(plot3_Bar[2]); plot3_Bar[0]->moveAbove(plot3_Bar[1]); //设置横坐标 plots[2]->xAxis->setAutoTicks(false); plots[2]->xAxis->setAutoTickLabels(false); plots[2]->xAxis->setSubTickCount(0); plots[2]->xAxis->setTickLength(0, 4); plots[2]->xAxis->grid()->setVisible(false); plots[2]->xAxis->setRange(0, 8); plots[2]->yAxis->grid()->setSubGridVisible(false); //横坐标赋值 plot3_keys << 1 << 2 << 3 << 4 << 5 << 6 << 7; plots[2]->xAxis->setTickVector(plot3_keys); plots[2]->xAxis->setTickVectorLabels(plot3_labels); } void frmMain::InitPlot4() { //初始化横坐标名称 plot4_labels << "水量超限报警" << "缺水报警" << "无传感器" << "温度过高" << "温度过低" ; plot4_labels << "湿度过高" << "湿度过低" << "环境温度过低" << "温度超限停机"; //初始化纵坐标值/柱状对象 for (int i = 0; i < Plot4_Count; i++) { plot4_values.append(0); plot4_keys.append(i + 1); QCPBars *bar = new QCPBars(plots[3]->xAxis, plots[3]->yAxis); bar->setName(plot4_labels[i]); plots[3]->addPlottable(bar); plot4_Bar.append(bar); } //设置柱状图形颜色 QPen pen; pen.setWidthF(LineWidth); pen.setColor(Plot4_AlarmColor1); plot4_Bar[0]->setPen(pen); plot4_Bar[0]->setBrush(Plot4_AlarmColor1X); pen.setColor(Plot4_AlarmColor2); plot4_Bar[1]->setPen(pen); plot4_Bar[1]->setBrush(Plot4_AlarmColor2X); pen.setColor(Plot4_AlarmColor3); plot4_Bar[2]->setPen(pen); plot4_Bar[2]->setBrush(Plot4_AlarmColor3X); pen.setColor(Plot4_AlarmColor4); plot4_Bar[3]->setPen(pen); plot4_Bar[3]->setBrush(Plot4_AlarmColor4X); pen.setColor(Plot4_AlarmColor5); plot4_Bar[4]->setPen(pen); plot4_Bar[4]->setBrush(Plot4_AlarmColor5X); pen.setColor(Plot4_AlarmColor6); plot4_Bar[5]->setPen(pen); plot4_Bar[5]->setBrush(Plot4_AlarmColor6X); pen.setColor(Plot4_AlarmColor7); plot4_Bar[6]->setPen(pen); plot4_Bar[6]->setBrush(Plot4_AlarmColor7X); pen.setColor(Plot4_AlarmColor8); plot4_Bar[7]->setPen(pen); plot4_Bar[7]->setBrush(Plot4_AlarmColor8X); pen.setColor(Plot4_AlarmColor9); plot4_Bar[8]->setPen(pen); plot4_Bar[8]->setBrush(Plot4_AlarmColor9X); //设置横坐标 plots[3]->xAxis->setAutoTicks(false); plots[3]->xAxis->setAutoTickLabels(false); plots[3]->xAxis->setSubTickCount(0); plots[3]->xAxis->grid()->setVisible(false); plots[3]->xAxis->setRange(0, Plot4_Count + 1); //横坐标赋值 plots[3]->xAxis->setTickVector(plot4_keys); plots[3]->xAxis->setTickVectorLabels(plot4_labels); } void frmMain::InitPlot5() { maxValue = 0; //初始化横坐标名称 plot5_labels << "水量超限报警" << "缺水报警" << "无传感器" << "温度过高" << "温度过低" ; plot5_labels << "湿度过高" << "湿度过低" << "环境温度过低" << "温度超限停机"; //初始化纵坐标值/柱状对象 for (int i = 0; i < Plot5_Count; i++) { plot5_values.append(0); plot5_keys.append(i + 1); QCPBars *bar = new QCPBars(plots[4]->xAxis, plots[4]->yAxis); bar->setName(plot5_labels[i]); plots[4]->addPlottable(bar); plot5_Bar.append(bar); } //设置柱状图形颜色 QPen pen; pen.setWidthF(LineWidth); pen.setColor(Plot4_AlarmColor1); plot5_Bar[0]->setPen(pen); plot5_Bar[0]->setBrush(Plot4_AlarmColor1X); pen.setColor(Plot4_AlarmColor2); plot5_Bar[1]->setPen(pen); plot5_Bar[1]->setBrush(Plot4_AlarmColor2X); pen.setColor(Plot4_AlarmColor3); plot5_Bar[2]->setPen(pen); plot5_Bar[2]->setBrush(Plot4_AlarmColor3X); pen.setColor(Plot4_AlarmColor4); plot5_Bar[3]->setPen(pen); plot5_Bar[3]->setBrush(Plot4_AlarmColor4X); pen.setColor(Plot4_AlarmColor5); plot5_Bar[4]->setPen(pen); plot5_Bar[4]->setBrush(Plot4_AlarmColor5X); pen.setColor(Plot4_AlarmColor6); plot5_Bar[5]->setPen(pen); plot5_Bar[5]->setBrush(Plot4_AlarmColor6X); pen.setColor(Plot4_AlarmColor7); plot5_Bar[6]->setPen(pen); plot5_Bar[6]->setBrush(Plot4_AlarmColor7X); pen.setColor(Plot4_AlarmColor8); plot5_Bar[7]->setPen(pen); plot5_Bar[7]->setBrush(Plot4_AlarmColor8X); pen.setColor(Plot4_AlarmColor9); plot5_Bar[8]->setPen(pen); plot5_Bar[8]->setBrush(Plot4_AlarmColor9X); //设置横坐标 plots[4]->xAxis->setAutoTicks(false); plots[4]->xAxis->setAutoTickLabels(false); plots[4]->xAxis->setSubTickCount(0); plots[4]->xAxis->grid()->setVisible(false); plots[4]->xAxis->setRange(0, Plot5_Count + 1); //横坐标赋值 plots[4]->xAxis->setTickVector(plot5_keys); plots[4]->xAxis->setTickVectorLabels(plot5_labels); } void frmMain::LoadPlot1() { plot1_values.clear(); for (int i = 0; i < Plot1_Count; i++) { double value = qrand() % Plot1_MaxY; plot1_values.append(value); } plots[0]->graph(0)->setData(plot1_keys, plot1_values); plots[0]->graph(0)->rescaleAxes(); plots[0]->replot(); } void frmMain::LoadPlot2() { plot2_key = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0; plot2_value = qrand() % Plot2_MaxY; plots[1]->graph(0)->addData(plot2_key, plot2_value); plots[1]->graph(0)->removeDataBefore(plot2_key - Plot2_Count - 1); plots[1]->xAxis->setRange(plot2_key, Plot2_Count , Qt::AlignRight); plots[1]->replot(); } void frmMain::LoadPlot3() { plot3_values1.clear(); plot3_values2.clear(); plot3_values3.clear(); for (int i = 0; i < 10; i++) { double value1 = qrand() % 80; double value2 = qrand() % 100; double value3 = qrand() % 300; plot3_values1.append(value1); plot3_values2.append(value2); plot3_values3.append(value3); } //设置柱状图形数据 plot3_Bar[0]->setData(plot3_keys, plot3_values1); plot3_Bar[1]->setData(plot3_keys, plot3_values2); plot3_Bar[2]->setData(plot3_keys, plot3_values3); plots[2]->replot(); } void frmMain::LoadPlot4() { plot4_values.clear(); for (int i = 0; i < Plot4_Count; i++) { double value = qrand() % (Plot4_MaxY - 10); plot4_values.append(value); plot4_Bar[i]->clearData(); plot4_Bar[i]->addData(i + 1, plot4_values[i]); } plots[3]->replot(); } void frmMain::LoadPlot5() { maxValue = 0; plot5_currentValue.clear(); plot5_values.clear(); for (int i = 0; i < Plot5_Count; i++) { double value = qrand() % (Plot5_MaxY - 1); plot5_currentValue.append(0); plot5_values.append(value); } } void frmMain::UpdatePlot5() { for (int i = 0; i < Plot5_Count; i++) { if (plot5_currentValue[i] < plot5_values[i]) { plot5_Bar[i]->clearData(); plot5_Bar[i]->addData(i + 1, plot5_currentValue[i]); plot5_currentValue[i]++; } } maxValue++; plots[4]->replot(); if (maxValue >= (Plot5_MaxY - 1)) { maxValue = 0; plot5_timer->stop(); } } void frmMain::on_btnLoad_clicked() { if (currentIndex == 0) { LoadPlot1(); } else if (currentIndex == 1) { if (ui->btnLoad->text() == "开始模拟") { plot2_timer->start(100); ui->btnLoad->setText("停止模拟"); } else { plot2_timer->stop(); ui->btnLoad->setText("开始模拟"); } } else if (currentIndex == 2) { LoadPlot3(); } else if (currentIndex == 3) { LoadPlot4(); } else if (currentIndex == 4) { LoadPlot5(); //启动定时器动态加载柱状条 plot5_timer->start(0); } } void frmMain::on_btnSkin_clicked() { if (currentSkin == ":/image/dev.css") { currentSkin = ":/image/black.css"; } else if (currentSkin == ":/image/black.css") { currentSkin = ":/image/brown.css"; } else if (currentSkin == ":/image/brown.css") { currentSkin = ":/image/blue.css"; } else if (currentSkin == ":/image/blue.css") { currentSkin = ":/image/gray.css"; } else if (currentSkin == ":/image/gray.css") { currentSkin = ":/image/white.css"; } else if (currentSkin == ":/image/white.css") { currentSkin = ":/image/silvery.css"; } else if (currentSkin == ":/image/silvery.css") { currentSkin = ":/image/dev.css"; } myHelper::SetStyle(currentSkin); } void frmMain::on_ckText_stateChanged(int arg1) { bool value = (arg1 == 0 ? false : true); if (value) { plots[0]->legend->setVisible(true); plots[1]->legend->setVisible(true); plots[2]->legend->setVisible(true); plots[3]->legend->setVisible(true); plots[4]->legend->setVisible(true); } else { plots[0]->legend->setVisible(false); plots[1]->legend->setVisible(false); plots[2]->legend->setVisible(false); plots[3]->legend->setVisible(false); plots[4]->legend->setVisible(false); } foreach (QCustomPlot * plot, plots) { plot->replot(); } } void frmMain::on_ckBackground_stateChanged(int arg1) { bool value = (arg1 == 0 ? false : true); if (value) { plots[0]->graph(0)->setBrush(QBrush(Plot1_BGColor)); plots[1]->graph(0)->setBrush(QBrush(Plot2_BGColor)); } else { plots[0]->graph(0)->setBrush(QBrush(Plot_NoColor)); plots[1]->graph(0)->setBrush(QBrush(Plot_NoColor)); } plots[0]->replot(); plots[1]->replot(); } void frmMain::on_ckMove_stateChanged(int arg1) { bool value = (arg1 == 0 ? false : true); if (value) { ui->plot1->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); ui->plot2->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); ui->plot3->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); ui->plot4->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); ui->plot5->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); } else { ui->plot1->setInteractions(QCP::iSelectOther); ui->plot2->setInteractions(QCP::iSelectOther); ui->plot3->setInteractions(QCP::iSelectOther); ui->plot4->setInteractions(QCP::iSelectOther); ui->plot5->setInteractions(QCP::iSelectOther); } } void frmMain::on_tabWidget_currentChanged(int index) { currentIndex = index; plot2_timer->stop(); plot5_timer->stop(); maxValue = 0; ui->plot2->graph(0)->clearData(); ui->plot2->replot(); if (currentIndex == 1) { ui->btnLoad->setText("开始模拟"); } else { ui->btnLoad->setText("加载数据"); } }

[3].[图片] android1.png 跳至 [1] [2] [3] [4] [5] [6]

[4].[图片] xp4.jpg 跳至 [1] [2] [3] [4] [5] [6]

[5].[图片] xp7.jpg 跳至 [1] [2] [3] [4] [5] [6]

[6].[图片] ubuntu4.png 跳至 [1] [2] [3] [4] [5] [6]

SyntaxHighlighter.autoloader( 'applescript /js/sh309/scripts/shBrushAppleScript.js?t=1420773622000', 'actionscript3 as3 /js/sh309/scripts/shBrushAS3.js?t=1420773622000', 'bash shell /js/sh309/scripts/shBrushBash.js?t=1420773622000', 'coldfusion cf /js/sh309/scripts/shBrushColdFusion.js?t=1420773622000', 'cpp c /js/sh309/scripts/shBrushCpp.js?t=1420773622000', 'obj-c objc /js/sh309/scripts/shBrushObjC.js?t=1420773622000', 'c# c-sharp csharp /js/sh309/scripts/shBrushCSharp.js?t=1420773622000', 'css /js/sh309/scripts/shBrushCss.js?t=1420773622000', 'delphi pascal /js/sh309/scripts/shBrushDelphi.js?t=1420773622000', 'diff patch pas /js/sh309/scripts/shBrushDiff.js?t=1420773622000', 'erl erlang /js/sh309/scripts/shBrushErlang.js?t=1420773622000', 'groovy /js/sh309/scripts/shBrushGroovy.js?t=1420773622000', 'haxe hx /js/sh309/scripts/shBrushHaxe.js?t=1420773622000', 'java /js/sh309/scripts/shBrushJava.js?t=1420773622000', 'jfx javafx /js/sh309/scripts/shBrushJavaFX.js?t=1420773622000', 'js jscript javascript /js/sh309/scripts/shBrushJScript.js?t=1420773622000', 'perl pl /js/sh309/scripts/shBrushPerl.js?t=1420773622000', 'php /js/sh309/scripts/shBrushPhp.js?t=1420773622000', 'text plain /js/sh309/scripts/shBrushPlain.js?t=1420773622000', 'py python /js/sh309/scripts/shBrushPython.js?t=1420773622000', 'ruby rails ror rb /js/sh309/scripts/shBrushRuby.js?t=1420773622000', 'scala /js/sh309/scripts/shBrushScala.js?t=1420773622000', 'sql /js/sh309/scripts/shBrushSql.js?t=1420773622000', 'vb vbnet /js/sh309/scripts/shBrushVb.js?t=1420773622000', 'xml xhtml xslt html /js/sh309/scripts/shBrushXml.js?t=1420773622000' ); SyntaxHighlighter.all();

1、windows API: WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。Windows API包括几千个可调用的函数,其中包括的用户界面服务、图形多媒体服务等可用于图形界面的开发。 2、MFC: MFC以C++类的形式封装了Windows API,并且包

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

C++中Chartctrl控件怎么删除原来画的曲线

在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等。在前面4讲中介绍了MFC经常用的TeeChart控件和Hight-Speed Chart Ctrl,这两个都是MFC绘图控件的经典(另外,在Qt中还有QwtPlot和QCustomPlot两大神器)。许多人问如何绘制动态变化的曲线,为此专门写下这篇文章。

C++ GUI 绘图控件目录

MFC(VC)

  • VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入

  • VS2010 使用TeeChart绘图控件 - 之二 - 绘制图形(折线图,柱状图)

  • TeeChart绘图控件 - 之三 - 提高绘图的效率

  • MFC下好用的高速绘图控件-(Hight-Speed Charting)

  • 绘制动态曲线

  • Qt

  • qt超强精美绘图控件 - QCustomPlot一览

  • qt超强绘图控件qwt - 安装及配置

  •    

对于任何绘图控件,都可以实现动态绘图,其原则是:控件只负责绘图,若想曲线动,就让数据动,就像看电影一样,电影是由一帧一帧的静态图片组合起来的,在一定速度上刷新,静态图片就能动起来;和电影的原理一样,绘图控件能显示静态的曲线,想要它动起来,就让它频在一定时间刷新就可以了。    

这就是动态绘图的实现原理。

实现动态曲线需要以下两个准备:

  • 计时器Timer

  • 数组左移

  • 基于Timer的绘图

    任何界面库都会有Timer这个实现,在MFC中时OnTimer消息,在Qt中是QTimer类,那种原理基本都一样,下面将以MFC(VC)为例进行说明。

    Timer是消息级别最低的消息,它会保证其它级别高的消息优先执行,因此,就算数据大量刷新,也不会影响主线程的其它消息。

    MFC生成OnTimer消息,消息响应函数如下:

  • void CTeeChartDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码或调用默认值CDialogEx::OnTimer(nIDEvent);}
  • 绘图的实现就在这个消息响应函数里
  • 如果让定时器设定为1秒触发,每一秒把旧数据去除,绘制新数据,就能看到不停变换的波形;对于趋势图,假如每秒有一个新数据,那么就在定长数组中,把数组所有数据整体左移,同时数组末端加入新数据。代码如下:

  • /// /// \brief 左移数组/// \param ptr 数组指针/// \param data 新数值///void LeftMoveArray(double* ptr,size_t length,double data){for (size_t i=1;i<length;++i){ptr[i-1] = ptr[i];}ptr[length-1] = data;}
  • 此函数把整个数组左移,然后新数据放置在数组最末端(右端)。
  • 这样,数组就实现“向左运动”,把左移后的数组绘制,就能在绘图控件上发现其变化。

    下面开始实现动态绘图(这里演示TeeChart的方法,附件里有HightSpeed-Chart CChartCtrl的方法):

  • void CTeeChartDlg::OnBnClickedButtonRuning(){KillTimer(0);ZeroMemory(&m_TeeChartArray,sizeof(double)*m_c_arrayLength);for (size_t i=0;i<m_c_arrayLength;++i){m_X[i] = i;}m_count = m_c_arrayLength;CSeries chart_T = (CSeries)m_Chart.Series(0);chart_T.Clear();m_pLineSerie->ClearSerie();SetTimer(0,1000,NULL);}
  • 函数中几个成员变量的定义是:
  • double m_TeeChartArray[2096];double m_X[2096];unsigned int m_count;const size_t m_c_arrayLength = 2096;
  • m_TeeChartArray是需要绘制的数组的Y值,m_X是对应的x值,m_count是计数器,每绘制一次,个数加1,主要用于x轴

    在timer中的实现如下:

  • void CTeeChartDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值if(0 == nIDEvent){++m_count;drawMoving();}CDialogEx::OnTimer(nIDEvent);}
  • drawMoving函数用于绘图,timer设定为1秒触发一次,这时就能看到每秒的变化,如果数据是以1秒为刷新周期,每一秒有个新数据,只需要把旧的数据向左移,新数据放到数组最右端,再在绘图控件上把此图形画出来即可看的像动一样。
  • drawMoving函数的实现如下:

  • void CTeeChartDlg::drawMoving(){CSeries chart_T = (CSeries)m_Chart.Series(0);chart_T.Clear();m_pLineSerie->ClearSerie();LeftMoveArray(m_TeeChartArray,m_c_arrayLength,randf(0,10));LeftMoveArray(m_X,m_c_arrayLength,m_count);DrawLine_TeeChart(m_X,m_TeeChartArray,m_c_arrayLength);}
  • 前面说过timer是优先级最低的消息,如果想曲线动的流畅,可以把时钟设置为0ms,如
  • SetTimer(0,0,NULL);
  • 这时会在保证界面流畅的前提下,以最高频率刷新。这样看到的图形会非常流畅。
  • 上面介绍的就是动态绘制曲线的思路和方法,附件中有用TeeChart实现和HightSpeedChart实现的例子,考虑到可能有些人没有安装TeeChart,专门把TeeChart分离出来了一个源码,只有HightSpeedChart,不需要安装任何控件。

    demo1:

    MFC下TeeChart和HightSpeedChart动态绘制曲线图-VS2010

    demo2(不用安装任何控件):

    MFC动态绘制曲线图-HightSpeedChart实现

追问我的点是一屏幕一屏幕画的,我想再第二次画图的时候把第一次画的曲线给擦除,两次点的横坐标是相同的,这个可以做到吗我的点是一屏幕一屏幕画的,我想再第二次画图的时候把第一次画的曲线给擦除,两次点的横坐标是相同的,这个可以做到吗

怎么在Visual C++ 6.0 中画柱状图,曲线图显示学生成绩统计结果

这个只能根据当前的学生成绩数据写代码进行绘制了.

最简单的是写一个绘制函数,加一个定时器,比如没间隔500ms就调用一次绘制函数,

把新的图形绘制到界面,这就实现了图形随成绩数据实时改变.

曲线图只需要把每个点连接起来就行,柱状图要绘制矩形填充颜色等.

推荐最好去CSDN上找一下这类的资源.

编写完成了一个C/C++程序,如何做一个界面出来?

最简单的方法是用vc6新建一个Win32 Application空工程,然后添加一个cpp文件,输入

(注意添加对话框资源,并且在对话框上添加一个文本框)

#include <Windows.h>

#include "resource.h"

// DialogProc, 枚举窗口对话框过程.

int CALLBACK DialogProc( HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam){

switch(uMsg){

case WM_INITDIALOG:{

SendDlgItemMessage(hdlg,IDC_EDIT1,EM_REPLACESEL,0,(long)"文本......");

}break;

case WM_DESTROY: break;

case WM_COMMAND:

switch(LOWORD(wParam)){

case IDCANCEL:

case IDOK:{

// DestroyWindow(hdlg);

EndDialog(hdlg,0);

} break;

default: break; // switch(LOWORD(wParam))} break; // case WM_COMMAND:

} // switch(uMsg)

return false;}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE,LPSTR,int){

// HWND hDialog=CreateDialog(hInst,(LPCTSTR)IDD_DIALOG1,0L,DialogProc);

return DialogBox(hInst,(LPCTSTR)IDD_DIALOG1,0L,DialogProc);}

c++用Qt之后写图形界面是否比Java用swing简单

界面是用户能够直接看到的,称为“前端”;业务逻辑的处理用户看不到,在背后默默进行,称为“后台”。

  • 传统的GUI程序开发不区分前端和后台,统一使用C++代码管理,源文件中既有创建和设置控件的代码,又有处理业务逻辑的代码,非常杂乱。

  • 使用C++代码直接创建控件,不管是从语法上讲还是从代码量上讲,看起来都比较“麻烦”。学过web开发的朋友应该会有体会,网页就是将前端和后台无缝集成的经典例子。

  • 在网页中,我们能看到的各种文字、颜色、图片、布局、按钮、菜单、列表等界面元素都是使用HTML+CSS(专门用来设计界面的声明式语言)创建的,而后台逻辑才需要JavaScript、Python、PHP、Java等编程语言来处理。

  • 现代GUI程序的设计,或许也借鉴了Web开发的思想,可以使用 XML 来设计界面,使用C++来处理后台逻辑,在 Qt 中可以轻而易举的做到前端和后台分离,从而让代码逻辑更加清晰,开发更加高效。

  • 使用Qt Designer

    Qt Designer 是与 Qt 配套的界面设计工具,使用它可以轻而易举的拖拽出简单的界面,下面我们就来学习一下。

    在博客   “在Qt中使用C++代码创建界面”  中讲到了,创建 Qt Widgets Application 项目的第四步是填写类信息,

    如下图所示:

    “创建界面”选项默认是被勾选的。

    项目创建完成后可以看到,勾选了“创建界面”选项,IDE 会多生成一个mainwindow.ui文件,如下图所示:

    双击 mainwindow.ui,就可以进入设计模式,启动 Qt Designer,如下图所示:

    再切换回编辑模式,就可以看到 mainwindow.ui 的源代码,如下图所示:

    .ui文件是 Qt Designer 的界面设计文件,由 XML 代码构成。Qt Creator 不允许在编辑模式下修改 .ui 文件,只能切换到设计模式由 Qt Designer 自动生成。

    XML是一种标记语言(也称声明式语言),由一个一个地节点组成,每个节点还可以包含多个属性,HTML 就是 XML 的一种具体化。

    XML 是程序员必备的技能,也很简单,开发中会经常用到,可以不熟练,但要有所了解。

    在编辑区看到的界面,仅包含了程序的客户区,没有包含标题栏,所以不会看到最大化、最小化、关闭等常见按钮。

    新创建的程序,默认包含了菜单栏、工具栏和状态栏。如下图所示:

    大家可以从左侧的控件箱中拖拽几个控件到编辑区的窗口中,亲自测试一下效果。如下图所示:(左侧控件箱中的控件都可以用鼠标拖到编辑区域,)

    下图是我拖拽出的一个记事本界面。运行结果为:

qt 只能写c++程序吗,不能写c语言的程序吗,要写c只能用 gtk吗?

qt使用的是gcc的编译器,准确的说,是g++编译器。

使用qt是可以写C语言的程序的,因为g++编译器,或者说所有的C++编译器,均可以兼容大部分的C语言程序,只在关键字和void *指针转换上略有区别。

不过,qt的强大在于其C++界面,所以用qt来写C程序,并不是好的选择。

总结就是,能用,但是不好用。

  • 本文相关:
  • [Java]解析逻辑表达式
  • [C/C++]QT编写的数据转曲线工具
  • [JavaScript]html编辑器tinymce使用配置教程实例dem...
  • [PHP]官方微信接口(全接口) - 微信摇一摇接...
  • [Python]练习
  • [Python]合并字典
  • [Python]演示生成器
  • [Python]演示断言
  • [C/C++]自用
  • [JavaScript]加密
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved