Qt学习之拾取框设置

一、效果图

说明:左右移动滑动条,窗口里面白色拾取框的尺寸会随之缩小放大(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();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值