QT软件开发: 点击鼠标在窗口里绘制矩形(窗口透明背景)

本文介绍了如何在QT软件开发中创建一个具有透明背景的窗口,通过鼠标事件处理实现在窗口内绘制矩形并支持区域选择功能,包括截图和屏幕录像等应用。
摘要由CSDN通过智能技术生成

QT软件开发: 点击鼠标在窗口里绘制矩形(窗口透明背景)-腾讯云开发者社区-腾讯云

一、功能需求

一般在软件开发中,需要都有选择区域的需求,比如:

1. 截图软件,需要鼠标选择指定区域截图

2. 屏幕录像软件,需要鼠标选择指定区域录像

3. 图片浏览器,需要鼠标选择指定区域放大查看

4. 视频播放器,需要鼠标选择指定区域放大播放

...........

工程下载地址: https://download.csdn.net/download/xiaolong1126626497/21043499

二、运行效果

三、示例代码

3.1 widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //隐藏标题栏
    setWindowFlags(Qt::FramelessWindowHint);//无边框 置顶

    //设置窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground);

    //全屏显示
    showFullScreen();

    //设置样式
    this->setStyleSheet("#Widget{background-color: rgba(0, 0, 0, 150);}");
}

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

void Widget::paintEvent(QPaintEvent *p1)
{
    //绘制样式
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);//绘制样式

    if(isPressedWidget)
    {
       //定义画笔
        QPen pen;
        pen.setWidth(5);
        pen.setColor(QColor("#00B0AE"));
        pen.setStyle(Qt::DashDotLine);
        p.setPen(pen);

        //创建画刷
        QBrush brush;
        brush.setColor(QColor("#00B0AE"));
        brush.setStyle(Qt::Dense6Pattern);
        p.setBrush(brush);

        QRect tempRt(m_startPT, m_endPT);
        p.drawRect(tempRt);
    }
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    m_endPT = m_startPT = event->pos();
    isPressedWidget = true; // 当前鼠标按下的即是QWidget而非界面上布局的其它控件
}


void Widget::mouseMoveEvent(QMouseEvent *event)
{
    QPoint tmp_pos=event->pos();
    if(tmp_pos.x()>m_startPT.x() || tmp_pos.y()>m_startPT.y())
    {
        m_endPT = event->pos();
    }
    this->update();
}


void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    isPressedWidget = false; // 鼠标松开时,置为false
    QRect rect(m_startPT, m_endPT);
    qDebug()<<"选择的范围:"<<rect;
}

/*
工程: HTTP_Request
日期: 2021-08-12
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 进入全屏
*/
void Widget::on_pushButton_clicked()
{
     showFullScreen();
}

/*
工程: HTTP_Request
日期: 2021-08-12
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 退出全屏
*/
void Widget::on_pushButton_2_clicked()
{
    showNormal();
}

/*
工程: HTTP_Request
日期: 2021-08-12
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: close
*/
void Widget::on_pushButton_close_clicked()
{
    close();
}

3.2 widget.h代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStyleOption>
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    //截取鼠标事件绘制窗口位置. 因为标题栏隐藏后.窗口是无法拖动的。
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *p);
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::Widget *ui;
    bool isPressedWidget;

    QPoint	m_startPT;
    QPoint	m_endPT;
};
#endif // WIDGET_H

3.3 UI界面设计

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的窗口中有多个控件,那么当鼠标点击事件发生时,可能会被某个控件所阻挡,导致无法触发窗口的mousePressEvent()方法。这时候可以考虑在控件的mousePressEvent()方法中发送一个信号,通知窗口处理鼠标点击事件。以下是一个示例代码: 在窗口类中定义一个槽函数,用于处理鼠标点击事件: ```cpp void MyWidget::onChildWidgetClicked() { // TODO: 在这编写相应的处理逻辑 } ``` 在窗口类中连接控件的信号和槽: ```cpp MyChildWidget *childWidget = new MyChildWidget(this); // 创建一个子控件 connect(childWidget, SIGNAL(clicked()), this, SLOT(onChildWidgetClicked())); // 连接信号和槽 ``` 在控件类中定义信号,并在mousePressEvent()方法中发送信号: ```cpp class MyChildWidget : public QWidget { Q_OBJECT public: MyChildWidget(QWidget *parent = nullptr) : QWidget(parent) {} signals: void clicked(); // 定义一个clicked信号 protected: void mousePressEvent(QMouseEvent *event) override { emit clicked(); // 发送clicked信号 } }; ``` 在上面的示例代码中,我们先在窗口类中定义了一个槽函数`onChildWidgetClicked()`,用于处理鼠标点击事件。然后创建了一个子控件`childWidget`,并连接了子控件的`clicked()`信号和窗口类的`onChildWidgetClicked()`槽。最后在子控件类中定义了一个`clicked`信号,并在`mousePressEvent()`方法中发送该信号。这样,当子控件被点击时,就会发送`clicked`信号,从而触发窗口类的`onChildWidgetClicked()`槽函数,实现在控件被阻挡时也能够处理鼠标点击事件的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值