Qwt 图没有重绘
Qwt plot is not reploting
我在 class 方法中定义了一个 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_()时更新数据,应该更新plot
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() 从未被调用过。我测试了,所有的回调函数都被调用了。
令人惊讶的是,如果我调整 window 的大小,绘图会更新...如果我继续调整大小,绘图会在我这样做的同时更新。
正在通过定时器超时信号在主线程上完成重绘调用。我不明白这是怎么回事。
尽管在文档中它说不推荐使用 setAutoReplot 并且性能方面使用 replot 更好,但我测试了将 setAutoReplot 设置为 true
plot->setAutoReplot( true );
删除了 updateMe_() 中的 replot 调用,一切正常。
但对我来说这似乎是一个错误。
注意:我使用的是 Qwt 6.1.2。
注意:在 qwt 出现更多问题后,我切换到 qtcustomplot。只有一个头文件和一个cpp文件。我的两分钱以防万一有人在寻找替代品。
我在 class 方法中定义了一个 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_()时更新数据,应该更新plot
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() 从未被调用过。我测试了,所有的回调函数都被调用了。
令人惊讶的是,如果我调整 window 的大小,绘图会更新...如果我继续调整大小,绘图会在我这样做的同时更新。
正在通过定时器超时信号在主线程上完成重绘调用。我不明白这是怎么回事。
尽管在文档中它说不推荐使用 setAutoReplot 并且性能方面使用 replot 更好,但我测试了将 setAutoReplot 设置为 true
plot->setAutoReplot( true );
删除了 updateMe_() 中的 replot 调用,一切正常。
但对我来说这似乎是一个错误。
注意:我使用的是 Qwt 6.1.2。