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()函数用于将图表的标题和边距信息显示到窗口界面上。