当前位置:嗨网首页>书籍在线阅读

08-主窗口类定义和初始化

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.2.2 主窗口类定义和初始化

下面是主窗口类MainWindow的类定义(省略了Action和界面组件的槽函数定义)。在mainwindow.h文件中需要包含QtChart,并使用宏Qt_CHARTS_USE_NAMESPACE导入命名空间。

#include   <QtCharts>
Qt_CHARTS_USE_NAMESPACE
class MainWindow : public QMainWindow
{
   Q_OBJECT
private:
   QLineSeries *curSeries; //当前序列
   QValueAxis *curAxis; //当前坐标轴
   void   createChart(); //创建图表
   void   prepareData(); //更新数据
   void   updateFromChart(); //从图表更新到界面
public:
   explicit MainWindow(QWidget *parent = 0);
private:
   Ui::MainWindow *ui;
};

在MainWindow类中定义了两个私有变量,curSeries用于指向当前的QLineSeries序列,界面上对序列的设置操作都是针对选择的当前序列;curAxis用于指向当前的QValueAxis坐标轴,对坐标轴进行设置时就是针对当前坐标轴进行设置。

createChart()函数用于创建图表的各个基本部件,在构造函数里调用,prepareData()用于更新序列的数据,updateFromChart()用于读取图表的一些属性,并刷新界面显示。下面是主窗口构造函数,以及这3个函数的代码。

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   createChart();//创建图表
   prepareData();//生成数据
   updateFromChart(); //从图表获得属性值,刷新界面显示
}
void MainWindow::createChart()
{//创建图表的各个部件
   QChart *chart = new QChart();
   chart->setTitle("简单函数曲线");
   ui->chartView->setChart(chart);
   ui->chartView->setRenderHint(QPainter::Antialiasing);
   QLineSeries *series0 = new QLineSeries();
   QLineSeries *series1 = new QLineSeries();
   series0->setName("Sin曲线");
   series1->setName("Cos曲线");
   curSeries=series0; //当前序列
   QPen  pen;
   pen.setStyle(Qt::DotLine);
   pen.setWidth(2);
   pen.setColor(Qt::red);
   series0->setPen(pen); //折线序列的线条设置
   pen.setStyle(Qt::SolidLine);
   pen.setColor(Qt::blue);
   series1->setPen(pen);//折线序列的线条设置
   chart->addSeries(series0);
   chart->addSeries(series1);
   QValueAxis *axisX = new QValueAxis;
   curAxis=axisX; //当前坐标轴
   axisX->setRange(0, 10); //设置坐标轴范围
   axisX->setLabelFormat("%.1f"); //标签格式
   axisX->setTickCount(11); //主分隔个数
   axisX->setMinorTickCount(4);
   axisX->setTitleText("time(secs)"); //标题
   QValueAxis *axisY = new QValueAxis;
   axisY->setRange(-2, 2);
   axisY->setTitleText("value");
   axisY->setTickCount(5);
   axisY->setLabelFormat("%.2f"); //标签格式
   axisY->setMinorTickCount(4);
   chart->setAxisX(axisX, series0); //设置X坐标轴
   chart->setAxisX(axisX, series1); //设置X坐标轴
   chart->setAxisY(axisY, series0); //设置Y坐标轴
   chart->setAxisY(axisY, series1); //设置Y坐标轴
}
void MainWindow::prepareData()
{//为序列生成数据
QLineSeries *series0=(QLineSeries *)ui->chartView->chart()->series().at(0);
QLineSeries *series1=(QLineSeries *)ui->chartView->chart()->series().at(1);
   series0->clear(); //清除数据
   series1->clear();
   qsrand(QTime::currentTime().second());//随机数初始化
   qreal   t=0,y1,y2,intv=0.1;
   qreal   rd;
   int cnt=100;
   for(int i=0;iappend(t,y1);  //序列添加数据点
      rd=(qrand() % 10)-5; //随机数,-5~+5
      y2=qCos(t)+rd/50;
      series1->append(t,y2); //序列添加数据点
      t+=intv;
   }
}
void MainWindow::updateFromChart()
{ //从图表上获取数据更新界面显示
   QChart*  aChart=ui->chartView->chart();  //获取chart
   ui->editTitle->setText(aChart->title()); //图表标题
   QMargins   mg=aChart->margins(); //边距
   ui->spinMarginLeft->setValue(mg.left());
   ui->spinMarginRight->setValue(mg.right());
   ui->spinMarginTop->setValue(mg.top());
   ui->spinMarginBottom->setValue(mg.bottom());
}

MainWindow类的构造函数调用3个私有函数进行图表和界面的初始化。

createChart()函数用于创建QChart对象,创建数据序列和坐标轴,并将这些部件组合成一个完整的图表。createChart()函数的功能与实例samp9_1中的函数功能类似,只是没有为序列添加数据点。

注意 在MainWindow类中并没有定义QChart类的成员变量,后面要使用创建的图表对象,都通过ui->chartView->chart()来获得QChart对象。

prepareData()函数用于为图表中的两个序列生成数据,其中使用了随机数,以便使得每次生成的数据稍有不同。

updateFromChart()函数用于将图表的标题和边距信息显示到窗口界面上。