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

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

一、功能需求

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

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

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

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

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

...........

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

二、运行效果

三、示例代码

3.1 widget.cpp

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代码

cpp 复制代码
#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界面设计

相关推荐
旺小仔.1 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng5141 小时前
C++ STL-string类底层实现
前端·c++·算法
郝学胜-神的一滴1 小时前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
努力努力再努力wz3 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?4 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
祁同伟.4 小时前
【C++】动态内存管理
开发语言·c++
一只鲲5 小时前
40 C++ STL模板库9-容器2-vector
开发语言·c++
励志不掉头发的内向程序员5 小时前
C++基础——内存管理
开发语言·c++
jdlxx_dongfangxing5 小时前
从希格斯玻色子到 QPU:C++ 的跨维度征服
c++·量子计算·希格斯玻色子·高难度科普文
千里镜宵烛5 小时前
深入理解 Linux 线程:从概念到虚拟地址空间的全面解析
开发语言·c++·操作系统·线程