Qwt 图没有重新绘制

Posted

技术标签:

【中文标题】Qwt 图没有重新绘制【英文标题】:Qwt plot is not reploting 【发布时间】:2016-01-22 14:10:31 【问题描述】:

我在类方法中定义了一个 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() 从未被调用过。我测试了,所有回调函数都被调用了。

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

定时器超时信号正在主线程上完成 replot 调用。我不明白发生了什么。

【问题讨论】:

【参考方案1】:

尽管在文档中说不推荐使用 setAutoReplot 并且使用 replot 性能更好,但我测试了将 setAutoReplot 设置为 true

plot->setAutoReplot( true );

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

但对我来说,这似乎是一个错误。

注意:我使用的是 Qwt 6.1.2。

注意:在 qwt 出现更多问题后,我切换到 qtcustomplot。只有一个头文件和一个cpp文件。我的两分钱,以防有人在寻找替代品。

【讨论】:

以上是关于Qwt 图没有重新绘制的主要内容,如果未能解决你的问题,请参考以下文章

Qwt 仅重新绘制特定区域

qwt 在重新缩放或缩放光标后绘制移动曲线

Qwt 重新缩放轴

Qwt 追加点到绘图

QWT zoomer plus panner 连续重绘

Qwt - 我们可以绘制面积图吗?