欢迎使用CSDN-markdown编辑器
来源:互联网 发布:而又何羡乎的而 编辑:程序博客网 时间:2024/06/07 07:50
Controlling the axis range with a scrollbar
用滚动条控制坐标轴范围
控制坐标轴范围最直观的方式就是范围拖拽和放大缩小机制.它也是可能希望提供一个滚动条为了这个目的。这也是可以实现的通过连接一个坐标轴和滚动条的信号跟槽。一个中间的槽函数需要转换坐标轴的QCRange和滚动条的整型数值。
这个实例工程和这篇教程被称为scrollbar-axis-range-control并且是完整包的一部分。
QScrollbar是基于整型的由于这个原因我们需要一个因子转换整型值到坐标系。例如如果我们想要平滑的滚动坐标轴的坐标从-5到5.我们设置因子比如0.01并且因此滚动条的范围是-500,500.
ui->horizontalScrollBar->setRange(-500, 500);
ui->verticalScrollBar->setRange(-500, 500);
如果在任何点可以改变可访问的坐标范围,只需要改变滚动条的最大最小值。
中间的槽函数将要转换坐标被horzScrollBarChanged,vertScrollBarChanged,xAxisChanged,yAxisChanged。scrollbar和x/y轴用适当的信号连接在一起。
connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(horzScrollBarChanged(int))); connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(vertScrollBarChanged(int))); connect(ui->plot->xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(xAxisChanged(QCPRange))); connect(ui->plot->yAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(yAxisChanged(QCPRange)));
The coordinate transformation slots
坐标转换槽函数
槽的类型是很简单的.他们拿到scrollbar或者axis的值应用转换函数并且把结果设置到axis或者scrollbar。这有一些槽为了更新坐标轴范围在移动滚动块后。
void MainWindow::horzScrollBarChanged(int value) { if (qAbs(ui->plot->xAxis->range().center()-value/100.0) > 0.01) // if user is dragging plot, we don't want to replot twice { ui->plot->xAxis->setRange(value/100.0, ui->plot->xAxis->range().size(), Qt::AlignCenter); ui->plot->replot(); } } void MainWindow::vertScrollBarChanged(int value) { if (qAbs(ui->plot->yAxis->range().center()+value/100.0) > 0.01) // if user is dragging plot, we don't want to replot twice { ui->plot->yAxis->setRange(-value/100.0, ui->plot->yAxis->range().size(), Qt::AlignCenter); ui->plot->replot(); } }
这有两件事情值得被提到。
首先,我们看到这转换滚动条的值到坐标系通过除以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范围发生改变时。
void MainWindow::xAxisChanged(QCPRange range) { ui->horizontalScrollBar->setValue(qRound(range.center()*100.0)); // adjust position of scroll bar slider ui->horizontalScrollBar->setPageStep(qRound(range.size()*100.0)); // adjust size of scroll bar slider } void MainWindow::yAxisChanged(QCPRange range) { ui->verticalScrollBar->setValue(qRound(-range.center()*100.0)); // adjust position of scroll bar slider ui->verticalScrollBar->setPageStep(qRound(range.size()*100.0)); // adjust size of scroll bar slider }
他们只是将范围转换成滚动条的值并且范围的大小到滚动条的步长。
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- iOS开发:后台运行以及保持程序在后台长时间运行
- Javascript 严格模式use strict
- 有没有length()这个方法? String 有没有length()这个方法?
- mac下通过sublime Text的sftp插件编辑远程服务器文件
- Mybatis There is no getter for property named 'XXX' in 'class java.lang.XXX
- 欢迎使用CSDN-markdown编辑器
- DevExpress GridControl 自定义列统计
- spring整合JPA总结
- 手动导入aar依赖
- Android系统分区
- 移动APP奔溃测试
- Java重修之路(九)面向对象之final关键字,抽象类(abstract),接口(interface)
- springMVC自定义注解,用AOP来实现日志记录
- IEEE 802.15.4协议完整中文版 - 5.1.4 同步