QCustomPlot之用滚动条控制坐标轴范围

来源:互联网 发布:药店运营数据分析报告 编辑:程序博客网 时间:2024/06/17 12:53
Controlling the axis range with a scrollbar
用滚动条控制坐标轴范围


控制坐标轴范围最直观的方式就是范围拖拽和放大缩小机制.它也是可能希望提供一个滚动条为了这个目的。这也是可以实现的通过连接一个坐标轴和滚动条的信号跟槽。一个中间的槽函数需要转换坐标轴的QCRange和滚动条的整型数值。
这个实例工程和这篇教程被称为scrollbar-axis-range-control并且是完整包的一部分。


相关的信号向后传播改变并且向前是scrollbar的QScrollbar::valueChanged(int)和axis的QCPAxis::rangeChanged(QCPRange)。因为我们项开吃正常的范围拖拽和缩放。滚动块的位置和大小也必须被更新当axis的rangeChanged信号被发出。


QScrollbar是基于整型的由于这个原因我们需要一个因子转换整型值到坐标系。例如如果我们想要平滑的滚动坐标轴的坐标从-5到5.我们设置因子比如0.01并且因此滚动条的范围是-500,500.
ui->horizontalScrollBar->setRange(-500, 500);
ui->verticalScrollBar->setRange(-500, 500);
如果在任何点可以改变可访问的坐标范围,只需要改变滚动条的最大最小值。
中间的槽函数将要转换坐标被horzScrollBarChanged,vertScrollBarChanged,xAxisChanged,yAxisChanged。scrollbar和x/y轴用适当的信号连接在一起。
[cpp] view plain copy
 print?
  1. connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(horzScrollBarChanged(int)));  
  2. connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(vertScrollBarChanged(int)));  
  3. connect(ui->plot->xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(xAxisChanged(QCPRange)));  
  4. connect(ui->plot->yAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(yAxisChanged(QCPRange)));  
The coordinate transformation slots
坐标转换槽函数
槽的类型是很简单的.他们拿到scrollbar或者axis的值应用转换函数并且把结果设置到axis或者scrollbar。这有一些槽为了更新坐标轴范围在移动滚动块后。
[cpp] view plain copy
 print?
  1. void MainWindow::horzScrollBarChanged(int value)  
  2. {  
  3.   if (qAbs(ui->plot->xAxis->range().center()-value/100.0) > 0.01) // if user is dragging plot, we don't want to replot twice  
  4.   {  
  5.     ui->plot->xAxis->setRange(value/100.0, ui->plot->xAxis->range().size(), Qt::AlignCenter);  
  6.     ui->plot->replot();  
  7.   }  
  8. }  
  9.    
  10. void MainWindow::vertScrollBarChanged(int value)  
  11. {  
  12.   if (qAbs(ui->plot->yAxis->range().center()+value/100.0) > 0.01) // if user is dragging plot, we don't want to replot twice  
  13.   {  
  14.     ui->plot->yAxis->setRange(-value/100.0, ui->plot->yAxis->range().size(), Qt::AlignCenter);  
  15.     ui->plot->replot();  
  16.   }  
  17. }  



这有两件事情值得被提到。
首先,我们看到这转换滚动条的值到坐标系通过除以100.0.注意垂直滚动条当滑动块在上面时有一个低值当滑动块在底下时有一个高的值。对于plot的坐标轴这是反过来的,这就是为什么在计算垂直滚动条的表达始终有一个负号当设置yAxis的范围时。


qAbs(ui->plot->xAxis->range().center()-value/100.0) > 0.01这个条件是必须的以便于范围拖拽并没有导致replot,而是信号与槽之间反复导致的。这将会发生因为范围拖拽导致QCustomPlot自动replot自己然后发出rangeChanged信号.在这个程序中rangeChanged信号将调用xAxisChanged或者yAxisChanged槽去更新滚动条块的位置通过调用setValue的方法。这个方法又转过来发出scrollbar的valueChanged信号,这第二次的replot将会发生,如果检查不到位。检查将确保replot只会在当前坐标轴和滚动条的值确实不同时才会执行。
更新滚动条的槽函数当axis范围发生改变时。

[cpp] view plain copy
 print?
  1. void MainWindow::xAxisChanged(QCPRange range)  
  2. {  
  3.   ui->horizontalScrollBar->setValue(qRound(range.center()*100.0)); // adjust position of scroll bar slider  
  4.   ui->horizontalScrollBar->setPageStep(qRound(range.size()*100.0)); // adjust size of scroll bar slider  
  5. }  
  6.    
  7. void MainWindow::yAxisChanged(QCPRange range)  
  8. {  
  9.   ui->verticalScrollBar->setValue(qRound(-range.center()*100.0)); // adjust position of scroll bar slider  
  10.   ui->verticalScrollBar->setPageStep(qRound(range.size()*100.0)); // adjust size of scroll bar slider  
  11. }  
他们只是将范围转换成滚动条的值并且范围的大小到滚动条的步长。
0 0
原创粉丝点击