03-2Qt控件——QRubberBand橡皮筋+自定义样式

QRubberBand橡皮筋+自定义样式

一、介绍

1、QRubberBand名为橡皮筋选中:选中一个东西,显示其边框。一般是结合鼠标事件同时完成某项需求。单独没什么意义。

二、代码案例

在一个空白窗口内,展示多个复选框控件,通过橡皮筋实现批量选中与取消选中效果。

当鼠标按下,需要创建一个橡皮筋控件,鼠标移动的时候,调整橡皮筋控件的范围区域,当松开鼠标,拿到橡皮筋选中区域做判定,那些子控件在选中区域范围内,改变他的选中标识。

创建一个QtRubberBand项目,并使用QMainWindow作为主窗口,并放置一些复选框(注意不要添加布局)。

具体代码如下:

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug> //添加调试日志头文件
#include <QMouseEvent>
#include <QRubberBand>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建橡皮筋控件,并设置为矩形
    m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        /******* 鼠标左键按下时,设置为开始框选,显示橡皮筋 ********/
        //记录鼠标按下开始位置
        m_startPos = event->pos();
        //鼠标刚按下去是没有尺寸的,所以给他一个空的尺寸
        m_rubberBand->setGeometry(QRect(m_startPos, QSize()));
        //显示橡皮筋控件
        m_rubberBand->show();
    }
    QMainWindow::mousePressEvent(event); //事件继续向下传递
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    /******* 鼠标移动时,更新橡皮筋的尺寸,并根据框选范围勾选复选框控件 ********/
    if (m_rubberBand->isVisible()) {
        //橡皮筋控件是显示的,则更新橡皮筋的尺寸
        m_rubberBand->setGeometry(QRect(m_startPos, event->pos()).normalized());
    }
    QMainWindow::mouseMoveEvent(event); //事件继续向下传递
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    /******* 鼠标松开时,隐藏橡皮筋,并根据框选范围勾选复选框控件 ********/
    if (m_rubberBand->isVisible()) {
        //获取橡皮筋控件的尺寸范围
        const QRect rect = m_rubberBand->geometry();
        //查找所有复选框控件
        QList<QCheckBox*> checkBoxs = this->findChildren<QCheckBox*>();
        for (auto checkBox : checkBoxs) {
            //判断框选尺寸范围,是否包含复选框控件尺寸范围
            if(rect.contains(checkBox->geometry())) {
                //切换勾选状态
                checkBox->toggle();
            }
        }
        //隐藏橡皮筋的尺寸
        m_rubberBand->hide();
    }
    QMainWindow::mouseReleaseEvent(event);
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class QRubberBand;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    //重写鼠标按下事件
    void mousePressEvent(QMouseEvent * event) override;
    //重写鼠标移动事件
    void mouseMoveEvent(QMouseEvent* event) override;
    //重写鼠标松开事件
    void mouseReleaseEvent(QMouseEvent * event) override;

private:
    Ui::MainWindow *ui;
    QPoint m_startPos; //鼠标按下开始位置
    QRubberBand *m_rubberBand = nullptr; //橡皮筋
};
#endif // MAINWINDOW_H

运行效果图:

框选

框选完成

三、自定义样式

有时候,我们需要已定义橡皮筋的样式,此时我们就需要重写QRubberBand,重新实现重绘函数即可。

下面是将橡皮筋修改成深蓝色线框,框选背景为透明的代码:

MyRubberBand.cpp

#include "MyRubberBand.h"
#include "qevent.h"
#include <QPainter>

MyRubberBand::MyRubberBand(Shape shape, QWidget *parent)
    : QRubberBand(shape, parent)
{
}

void MyRubberBand::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //设置画笔为深蓝色,画笔宽度为4
    painter.setPen(QPen(QColor(0, 100, 179), 4));
    //设置背景色为透明
    painter.setBrush(Qt::transparent);
    //绘制框选的矩形图形
    painter.drawRect(event->rect());
}

MyRubberBand.h

#ifndef MYRUBBERBAND_H
#define MYRUBBERBAND_H

#include <QRubberBand>

//继承QRubberBand,进行扩展重写
class MyRubberBand : public QRubberBand
{
    Q_OBJECT
public:
    explicit MyRubberBand(Shape shape, QWidget *parent = nullptr);

protected:
    //重写绘制事件
    void paintEvent(QPaintEvent *event) override;
};

#endif // QRUBBERBAND_H

我们在new的时候使用我们的MyRubberBand类创建接口,如下

#include "MyRubberBand.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建橡皮筋控件,并设置为矩形
    //m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    m_rubberBand = new MyRubberBand(QRubberBand::Rectangle, this);
}

效果图如下:

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: QRubberBandQt 图形用户界面库中的一个类,它提供了一种方便的方法来在图形界面中显示橡皮筋效果。橡皮筋效果通常用于图形界面中的选择操作,例如用户在图像编辑器中选择一个区域或在文本编辑器中选择一段文本。QRubberBand 类提供了一组基本的方法来控制橡皮筋的形状、位置和外观,以及与之交互的方法。它还允许开发者自定义橡皮筋的外观,以适应特定的图形界面设计风格。 ### 回答2: QRubberBand是一个Qt框架中的类,用于在绘图或UI设计应用程序中实现一个矩形选择框。它能够在鼠标拖动期间绘制一个矩形,并可以调整选择框的大小和位置。 使用QRubberBand,开发者可以实现诸如选择多个图形对象或调整图形对象大小等功能。它通常与鼠标事件相结合使用,例如当鼠标按下时,开始绘制矩形选择框,并在鼠标释放时完成选择。在此过程中,我们可以使用QRubberBand的一些方法来获取或设置选择框的位置和大小,以便进行后续的操作。 QRubberBand类提供了几个构造函数,可以根据需要选择使用的样式和父组件。通过调用setGeometry()方法,可以设置选择框的起点位置和大小。而后,可以使用move()、resize()方法来动态修改选择框的位置和大小。 此外,QRubberBand还提供了几个便捷方法,如isVisible()、show()和hide()等,用于控制选择框的显示和隐藏。 总之,QRubberBand是一个非常实用的类,可用于在Qt应用程序中实现矩形选择框的功能。无论是用于图形操作还是用于UI设计,它都能提供方便快捷的矩形选择功能,并帮助我们实现更灵活、高效的交互体验。 ### 回答3: QRubberBand是一种用于绘制矩形选区的图形对象。在计算机应用程序中,我们经常需要通过鼠标拖动来选择或标记特定区域。QRubberBand可以在应用程序窗口中创建一个可见的矩形框,以便用户可以选择感兴趣的区域。 用户可以通过在鼠标按下并拖动的过程中创建QRubberBand对象,然后在释放鼠标按钮后将其显示在应用程序窗口中。QRubberBand的颜色、样式和粗细等属性可以根据应用程序的需求进行设置和修改。 一旦创建了QRubberBand对象,用户可以使用其提供的功能来获取用户选择的区域的坐标或大小。应用程序可以使用这些信息来执行特定的操作,例如截取选择区域的屏幕截图、将选择区域的图像保存到文件中,或者执行与选择区域相关的其他操作。 除了矩形选择区域外,QRubberBand还可以用于实现其他形状的选区,例如椭圆或多边形。它可以灵活地根据应用程序的需求进行定制和使用。 总而言之,QRubberBand是一种非常有用的图形对象,可以在应用程序中实现用户交互性的矩形或其他形状的选区功能,帮助用户选择感兴趣的区域并执行相关的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

气杀也么哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值