Qt实现截图选择框(仅实现选择框创建,非完整的截图功能)并发射信号给调用的槽函数

头文件:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mywidget.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    void OnSelectedBtn(QRect a);
};

#endif // MAINWINDOW_H
mywidget.h(继承于QWidget)

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPixmap>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPoint>

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

signals:
    void selected(QRect a);//信号
public slots:

private:
    void paintEvent(QPaintEvent *event);        //绘图函数
    void mouseMoveEvent(QMouseEvent *event);    //鼠标移动
    void mousePressEvent(QMouseEvent *event);   //鼠标点击
    void mouseReleaseEvent(QMouseEvent *event); //鼠标抬起
private:
    QPixmap my_picture;
    bool m_pressedFlag;//获取鼠标是否按下
    QPoint currPos;//鼠标当前位置
    QPoint startPos,endPos;//起始、结束、坐标
};

#endif // MYWIDGET_H
源文件:

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

//    MyWidget p;
//    p.resize(400,300);
//    p.move(200,200);
//    p.show();

    return a.exec();
}
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->selectedwidget,SIGNAL(selected(QRect)),
            this,SLOT(OnSelectedBtn(QRect)));
}

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

void MainWindow::OnSelectedBtn(QRect a)
{
    qDebug() << "关联......";
}
mywidget.cpp

#include "mywidget.h"
#include <QtGui>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    m_pressedFlag = false;
    startPos = endPos = QPoint(0,0);
    my_picture.load("D:/QT_Library/QJie_Tu/1.jpg");//图片存放位置
}

void MyWidget::paintEvent(QPaintEvent *event)//绘图函数
{
    QPainter painter(this);

    int width = this->width();
    int height = this->height();

    painter.drawPixmap(0,0,width,height,my_picture);//添加本地图片作为背景
    if(m_pressedFlag)//如果鼠标按下
    {
        //构建十字交叉线
        painter.setPen(QColor(0xFF,0,0));//设置线条颜色
        painter.drawLine(QPoint(0,currPos.y()),QPoint(width,currPos.y()));//X轴
        painter.drawLine(QPoint(currPos.x(),0),QPoint(currPos.x(),height));//Y轴
    }
    QRect select(startPos,endPos);//构建截图选择框
    //普通画法
//    painter.setBrush(QColor(0x88,0x88,0x88));
//    painter.drawRect(select);
    //透明度画法
    QRect full(0,0,width,height);
    painter.setBrush(QColor(0,0,0,100));
    painter.setClipRegion(QRegion(full)-QRegion(select));
    painter.drawRect(full);
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)//鼠标移动
{
    if(m_pressedFlag)
    {
        currPos = event->pos();
        endPos = event->pos();
        update();
    }
}

void MyWidget::mousePressEvent(QMouseEvent *event)//鼠标按下
{
    m_pressedFlag = true;
    startPos = endPos = event->pos();//截图框开始坐标
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)//鼠标抬起
{
    m_pressedFlag = false;
    update();
    QRect a(startPos,endPos);
    emit selected(a);//发射信号
}
设计界面:(选择Widget控件,提升为自定义控件)


效果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值