一、效果图
说明:左右移动滑动条,窗口里面白色拾取框的尺寸会随之缩小放大(Qt5.9.0)。
二、实现
MainWindow.ui
说明:如图,在UI界面拖入一个水平滑动条(Horizontal Scroll Bar)和一个widget。
MainWindow.h
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void DrawSelectionSize();
bool eventFilter(QObject *watched, QEvent *event);
private slots:
void OnSliderChanged();
private:
Ui::MainWindow *ui;
int m_nSelectSize;//滑动条的值,用来控制拾取框大小
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->horizontalSlider->setRange(0,12);//设置滑动条值的范围
ui->horizontalSlider->setSingleStep(1);//设置步长为1
m_nSelectSize = 10;
ui->horizontalSlider->setValue(m_nSelectSize);//初始化滑动条的值为10
//信号和槽 当滑动条的值发生改变时,即产生一个valueChanged(int)信号 执行槽函数OnSliderChanged
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(OnSliderChanged()));
ui->widget->installEventFilter(this);//事件过滤器 为Widget安装过滤器
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->widget && event->type() == QEvent::Paint)
{
DrawSelectionSize();
}
return QWidget::eventFilter(watched,event);
}
void MainWindow::DrawSelectionSize()
{
int size = m_nSelectSize;
QPoint pt = ui->widget->rect().center();
int wx = pt.x();
int wy = pt.y();
//绘制拾取框
QPainter painter(ui->widget);//定义画家
painter.setPen(Qt::white);//定义画笔
painter.drawRect(wx-size,wy-size,2*size,2*size);//参数分别表示矩形左上角起点坐标x,y,矩形宽度,高度
}
void MainWindow::OnSliderChanged()
{
//修改m_nSelectSize ,重新绘图
m_nSelectSize = ui->horizontalSlider->value();
ui->widget->update();
}