一、QScrollBar 基础知识
例子显示:
wight.h
Q_SIGNALS:
void valueChanged(int value);
private slots:
void horzScrollBarChanged(int value);
wight.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->horizontalScrollBar->setRange(0, 2000); // 范围是0 —— 2000
ui->horizontalScrollBar->setPageStep(1000); // 设置单页步进值为1000
ui->horizontalScrollBar->setSingleStep(20); // 单步行进值为20
connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this,
SLOT(horzScrollBarChanged(int)));
}
void Widget::horzScrollBarChanged(int value)
{
ui->lbValue->setText(QString("%1").arg(value));
}
二、QCustomPlot提供的范例程序
这个水平滚动轴和垂直滚动轴都是从中间开始的
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setupPlot();
/*
* 由于滚动条只支持整数值,我们将设置高默认范围-500..500
* 并将滚动条位置值除以100以提供滚动范围-5..5在浮点轴坐标中。
* 如果您想动态地增加滚动条可访问的范围,只需根据需要增加滚动条的最小/最大值。
*/
ui->horizontalScrollBar->setRange(-500, 500);
ui->verticalScrollBar->setRange(-500, 500);
// create connection between axes and scroll bars:
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)));
// initialize axis range (and scroll bar positions via signals we just connected):
ui->plot->xAxis->setRange(0, 6, Qt::AlignCenter); // x轴显示范围:(-3, 3)..(-8, -2)
ui->plot->yAxis->setRange(0, 10, Qt::AlignCenter); // y轴显示范围:(-5, 5)
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setupPlot()
{
// The following plot setup is mostly taken from the plot demos:
ui->plot->addGraph();
ui->plot->graph()->setPen(QPen(Qt::blue));
ui->plot->graph()->setBrush(QBrush(QColor(0, 0, 255, 20)));
ui->plot->addGraph();
ui->plot->graph()->setPen(QPen(Qt::red));
QVector<double> x(500), y0(500), y1(500);
for (int i=0; i<500; ++i)
{
x[i] = (i/499.0-0.5)*10;
y0[i] = qExp(-x[i]*x[i]*0.25)*qSin(x[i]*5)*5;
y1[i] = qExp(-x[i]*x[i]*0.25)*5;
}
ui->plot->graph(0)->setData(x, y0);
ui->plot->graph(1)->setData(x, y1);
/*
* 四个坐标轴, 右轴和顶轴的标记可见性(QCPAxis::setTickLabels)设置为false,
* 左轴和底轴的设置为true(显示)
*/
ui->plot->axisRect()->setupFullAxesBox(true);
ui->plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);//允许鼠标拖拽和缩放
}
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();
}
}
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
/*
* qRound的作用是将值四舍五入到最接近的整数。
*/
}
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
}
运行结果如下,
三、应用
如果要,从左边开始,向右滑动。
ecgdfrom::ecgdfrom(QWidget *parent) :
QDialog(parent),
ui(new Ui::ecgdfrom)
{
ui->setupUi(this);
xxx;
/* 下面的两句话就是绑定水平轴和相应的槽函数 */
/* 为什么移动水平轴,画面也会跟着移动,是因为画面上的点是之前就绘制好的, 移动水平轴只是改变视角而已 */
connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(horzScrollBarChanged(int)));
connect(ui->right_widget->xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(xAxisChanged(QCPRange)));
xxx;
}
/*
* qAbs的作用是返回输入参数对应类型的绝对值。
* 使用绝对值的原因是向左向右拖动水平轴。
* 这是一个槽函数,当用户拖动滚动条时,就会执行这个函数
*/
void ecgdfrom::horzScrollBarChanged(int value)
{
/* 修改失败: 不能将 maxRange 改为 minRange */
if (qAbs(ui->right_widget->xAxis->range().maxRange-value) > 1)
{
ui->right_widget->xAxis->setRange(value, (Rw+value));
ui->right_widget->replot();
xxx;//其他处理
}
}
void ecgdfrom::xAxisChanged(QCPRange range)
{
/* 修改了这部分,原先是被注销的 */
ui->horizontalScrollBar->setValue(ui->right_widget->xAxis->range().lower); // adjust position of scroll bar slider
ui->horizontalScrollBar->setPageStep(qRound(range.size())); // adjust size of scroll bar slider
}