QWT-qwt_plot类关于曲线条数过多崩溃的问题

wanghuakl 2016-03-10 01:13:08
#define Q_UP_LIMIT 60 //无功功率上限值: Mvar
#define VOLT_LEVEL_NUM 38 //电压档位个数

#define POWER_FACTOR_CURVE_NUM 8 //功率因数曲线个数
#define POWER_FACTOR_BASE 0.6 //功率因数基准值
#define POWER_FACTOR_STEP 0.05 //功率因数变化步长

#define Q_UP_LIMIT_2 60 //for test

#define PI 3.14159

Plot::Plot(QWidget *parent) :
QwtPlot(parent)
{
initCanvas();
}

Plot::~Plot()
{
/*
* 释放PQ曲线对象
*/
int i = 0;
for (i = 0; i < VOLT_LEVEL_NUM; i++)
{
delete m_pPQCurve[i];
}
/*
* 释放等功率因数曲线对象
*/
for (i = 0; i < POWER_FACTOR_CURVE_NUM; i++)
{
delete m_PowerFactorCurve[i];
}
/*
* 释放等视在功率曲线对象
*/
for (i = 0; i < Q_UP_LIMIT_2; i++)
{
delete m_pApparentPowerCurve[i];
}
}

void Plot::initCanvas()
{
//一个选择器,十字线,以xBottom和yLeft坐标
picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPlotPicker::CrossRubberBand,
QwtPicker::AlwaysOn, this->canvas());
picker->setStateMachine(new QwtPickerDragPointMachine());//拖拽点起作用
picker->setRubberBandPen(QPen(QColor(Qt::white)));
picker->setTrackerPen(QColor(Qt::yellow));

setAutoFillBackground(true);

this->canvas()->setPalette(QPalette(QColor(Qt::darkCyan)));// Qt::darkCyan

//设置标题
setTitle(QString("5#矿热炉运行曲线"));

//设置图例
// insertLegend(new QwtLegend(), QwtPlot::RightLegend);

//设置网格
QwtPlotGrid *grid = new QwtPlotGrid;
grid->enableXMin(true);
grid->setMajorPen(QPen(Qt::white, 0, Qt::DotLine));//大格子
grid->setMinorPen(QPen(Qt::gray, 0 , Qt::DotLine));//大格子里的小格子
grid->attach(this);

//设置Y轴
setAxisTitle(QwtPlot::yLeft, QObject::trUtf8("Active Power(MW)"));
setAxisScale(QwtPlot::yLeft, 0.0, 60.0);

//设置X轴
setAxisTitle(QwtPlot::xBottom, QObject::trUtf8("Reactive Power(Mvar)"));
setAxisScale(QwtPlot::xBottom, 0.0, 60.0);

/*
* PQ曲线
*/
int i = 0;
for (i = 0; i < VOLT_LEVEL_NUM; i++)
{
QString curveName = tr("PQ%1").arg(i+1);
m_pPQCurve[i] = new QwtPlotCurve(curveName);
m_pPQCurve[i]->setRenderHint(QwtPlotItem::RenderAntialiased); //切换渲染提示,启用抗锯齿
//m_pPQCurve[i]->setLegendAttribute(QwtPlotCurve::LegendShowLine); //设置曲线在QwtLegend显示的样式,可以是线,矩形,符号
m_pPQCurve[i]->setPen(QPen(Qt::red));
m_pPQCurve[i]->attach(this);
}

/*
* 绘制等功率因数曲线
*/
QVector<double> xData;
for (i = 0; i <= Q_UP_LIMIT; i++)
{
xData.append(i);
}
for (i = 0; i < POWER_FACTOR_CURVE_NUM; i++)
{
QString curveName = tr("PowFactorCurve%1").arg(i + 1);
m_PowerFactorCurve[i] = new QwtPlotCurve(curveName);
m_PowerFactorCurve[i]->setRenderHint(QwtPlotItem::RenderAntialiased); //切换渲染提示,启用抗锯齿
//m_PowerFactorCurve[i]->setLegendAttribute(QwtPlotCurve::LegendShowLine); //设置曲线在QwtLegend显示的样式,可以是线,矩形,符号
m_PowerFactorCurve[i]->setPen(QPen(Qt::blue));
m_PowerFactorCurve[i]->attach(this);

int j = 0;
double fPowFactor = POWER_FACTOR_BASE + i * POWER_FACTOR_STEP;
QVector<double> yData;
for (j = 0; j <= Q_UP_LIMIT; j++)
{
yData.append(fPowFactor*j);
}
m_PowerFactorCurve[i]->setSamples(xData, yData);
}

/*
* 绘制等视在功率曲线
*/ //*
for (i = 0; i < Q_UP_LIMIT_2; i++)
{
//QString curveName = tr("ApparentFactorCurve%1").arg(i+1);
m_pApparentPowerCurve[i] = new QwtPlotCurve();
m_pApparentPowerCurve[i]->setRenderHint(QwtPlotItem::RenderAntialiased); //切换渲染提示,启用抗锯齿
//m_pApparentPowerCurve[i]->setLegendAttribute(QwtPlotCurve::LegendShowLine); //设置曲线在QwtLegend显示的样式,可以是线,矩形,符号
m_pApparentPowerCurve[i]->setPen(QPen(Qt::green));
m_pApparentPowerCurve[i]->attach(this); /* 程序在此崩溃 */
/*
QVector<double> xData;
QVector<double> yData;
int j = 0;
double fStep = 1.0 / 80;
for (j = 0; j <= 40; j++)
{
xData.append((i+1)*3*sin(j*PI*fStep));
yData.append((i+1)*3*cos(j*PI*fStep));
}
m_pApparentPowerCurve[i]->setSamples(xData, yData);
*/
}
//*/
}


请问曲线条数有限制么,我把Q_UP_LIMIT_2 改到25 以下就没问题。
...全文
494 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghuakl 2016-05-04
  • 打赏
  • 举报
回复
问题已经解决,不是QWT的问题,m_pApparentPowerCurve[i]数据越界。

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧