Qwt情节不是重新绘制

时间:2016-01-22 14:10:32

标签: qt qwt

我在类方法中定义了一个Qwt图:

plot = new QwtPlot();
const int margin = 5;
plot->setContentsMargins( margin, margin, margin, 0 );
plot->setTitle( "Support polygon" );
plot->setCanvasBackground( Qt::white );
plot->setAxisScale( QwtPlot::yLeft, -0.8,0.8 );
plot->setAxisScale( QwtPlot::xBottom, -0.8,0.8 );

QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight);
layout->addWidget(plot);
setLayout(layout);

curve_ = new QwtPlotCurve();
curve_->attach( plot );
xData = new double[4];
yData = new double[4];

QTimer *replotTimer_ = new QTimer(this);
connect(replotTimer_, SIGNAL(timeout()), this, SLOT(updateMe_()));
replotTimer_->start(100);

当计时器调用回调函数updateMe_()并更新绘图时,数据会更新

void Support_polygon::updateMe_()
{
    curve_->setRawSamples(xData,yData,4);
    plot->replot();  
}

xData和yData也在一个线程中被修改,其回调函数是:

void Support_polygon::callback_()
{
    msg_mutex.lock();
    for (size_t ii=0; ii<msg.contacts.size(); ii++)
    {
        xData[ii] = 1.4f*float(std::rand())/float(RAND_MAX)-0.7;
        yData[ii] = 1.4f*float(std::rand())/float(RAND_MAX)-0.7;  
    }
    msg_mutex.unlock();
}

(现在我只是输入随机数,但是当这个数据有效时,数据将通过ROS消息传递,这就是为什么在不同的线程中)

问题是情节永远不会更新。好像从不调用replot()。我测试了所有回调函数。

令人惊讶的是,如果我调整窗口大小,情节会更新...如果我继续调整大小,那么在我这样做时情节会更新。

通过定时器超时信号在主线程上进行重新定时调用。我不明白发生了什么。

1 个答案:

答案 0 :(得分:0)

即使在文档中它说不推荐使用setAutoReplot,并且使用replot表现更好,我测试了将setAutoReplot设置为true

plot->setAutoReplot( true );

删除了updateMe_()中的replot调用,一切正常。

但对我而言,这似乎是一个错误。

注意:我正在使用Qwt 6.1.2。

注意:在qwt的更多问题之后我改用了qtcustomplot。只有一个标题和一个cpp文件。如果有人在寻找替代品,我的两分钱。