QT - ScrollBar 和 QCustomPlot 结合应用

一、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
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值