qt实现截图功能。类似qq截图

介绍一下截图工具的使用方法:
S开始截图
双击鼠标,开始截图,此时已经选中全部屏幕
拖拽左键选择区域,
在边上可以延展选择范围
点中间可以拖拽选中区域的位置。
右键保存
中间键清楚选区
P暂停截图
C关闭程序
1)首先在设计时,首先面临的第一个问题就是如何截图:
这是如何解决的呢?

QScreen *screen = QGuiApplication::primaryScreen();
//        //获取全屏截图
QPixmap p= screen->grabWindow(QApplication::desktop()->winId(),x,y,width,height);
//x,y,width,height都是自己设置的大小

2)截图时会有Winget窗口等的影响,因为运行时关闭窗口就无法,操作功能,所以需要让我们看不到窗口。
.cpp中需要写的

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TranslucentBackground);
cacheMap = new QPixmap(this->size());
cacheMap->fill(QColor(0, 0, 0, 1));

.cpp中重写的画图需要加的

QPainter qq(this);
qq.drawPixmap(0, 0, *cacheMap);

并且最重要的是记得把项目中ui的winget窗口拉大,超过屏幕的大小,这样才能接受鼠标事件。
3)当截图完成又不想退出程序,应该如何才能不影响操作别的软件的操作。
把窗口设计小了;

this->resize(1,1);

4)鼠标事件如何设置呢?直接帖代码

void Widget::mouseDoubleClickEvent ( QMouseEvent * ){
    if(starting==false)
    {
      starting=true;
      sScreenShot=true;
      QScreen *screen = QGuiApplication::primaryScreen();
     //获取全屏截图
     selectBox.setRect(0,0,1920,1080);
     selectPicture= screen->grabWindow(QApplication::desktop()->winId(),0,0,1920,1080);
     update();
     clickTwo=true;
    }
}
void Widget::mousePressEvent(QMouseEvent *event)
{
        QString btn;
       if(event->button() == Qt::LeftButton)
       {

            if(buttonLeft)
            {
           startPosition.setX(event->x());
           startPosition.setY(event->y());
           selectBox.setX(event->x());
           selectBox.setY(event->y());
           update();
            flag=0;
           //buttonLeft=false;
            }
            if(flag==0&&buttonMove==false&&buttonLeft==false){

            left=event->x()-startPosition.x();
            top=event->y()-startPosition.y();
            widthMove=endPosition.x()-startPosition.x();
            hightMove=endPosition.y()-startPosition.y();
            flag=1;

            }
           btn = "LeftButton";
       }
       else if(event->button() == Qt::RightButton)
       {
           pictureSave();
           sScreenShot=false;
           this->resize(1,1);

       }
       else if(event->button() == Qt::MidButton)
       {
           selectBox=QRect(0,0,0,0);
           update();
           clickTwo=false;
           sScreenShot=false;
           starting=false;
           buttonLeft=true;
           buttonMove=true;
           num=0;
           flag=0;
           btn = "MidButton";
       }

}
void Widget::execute()
{
    emit backSignal();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if(buttonMove)
    {
        selectBox.setWidth(event->x()-startPosition.x());
        selectBox.setHeight(event->y()-startPosition.y());
        endPosition.setX(event->x());
        endPosition.setY(event->y());
        buttonLeft=false;
        update();

    }else if(event->x()>startPosition.x()-10&&event->x()<startPosition.x()+10&&event->y()>startPosition.y()-10&&event->y()<startPosition.y()+10)
    {
        selectBox.setX(event->x());
        selectBox.setY(event->y());
        startPosition.setX(event->x());
        startPosition.setY(event->y());
        update();
    }
    else if(event->x()>endPosition.x()-10&&event->x()<endPosition.x()+10&&event->y()>endPosition.y()-10&&event->y()<endPosition.y()+10)
    {
        selectBox.setWidth(event->x()-startPosition.x());
        selectBox.setHeight(event->y()-startPosition.y());
        endPosition.setX(event->x());
        endPosition.setY(event->y());
        update();
    }else if(event->x()>endPosition.x()-10&&event->x()<endPosition.x()+10&&event->y()>startPosition.y()-10&&event->y()<startPosition.x()+10)
    {
        startPosition.setY(event->y());
        endPosition.setX(event->x());
        selectBox.setX(startPosition.x());
        selectBox.setY(startPosition.y());
        selectBox.setWidth(endPosition.x()-startPosition.x());
        selectBox.setHeight(endPosition.y()-startPosition.y());
        update();
    }else if(event->x()>startPosition.x()-10&&event->x()<startPosition.x()+10&&event->y()>endPosition.y()-10&&event->y()<endPosition.x()+10)
    {

        startPosition.setX(event->x());
        endPosition.setY(event->y());
        selectBox.setX(startPosition.x());
        selectBox.setY(startPosition.y());
        selectBox.setWidth(endPosition.x()-startPosition.x());
        selectBox.setHeight(endPosition.y()-startPosition.y());
        update();
    }
     else if(event->x()>startPosition.x()&&event->y()>startPosition.y()&&event->x()<endPosition.x()&&event->y()<endPosition.y()&&buttonMove==false&&flag==1)
    {
            selectBox.setX(event->x()-left);
            selectBox.setY(event->y()-top);
            startPosition.setX(event->x()-left);
            startPosition.setY(event->y()-top);
            endPosition.setX(startPosition.x()+selectBox.width());
            endPosition.setY(startPosition.y()+selectBox.height());
            selectBox.setWidth(widthMove);
            selectBox.setHeight(hightMove);
        update();
    }

}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    flag=0;
    if(clickTwo&&num>0)
    {
        if(startPosition.x()>endPosition.x())
        {
            int temp=startPosition.x();
            startPosition.setX(endPosition.x());
            endPosition.setX(temp);
        }
        if(startPosition.y()>endPosition.y())
        {
            int temp=startPosition.y();
            startPosition.setY(endPosition.y());
            endPosition.setY(temp);
        }
        selectBox.setX(startPosition.x());
        selectBox.setY(startPosition.y());
        selectBox.setWidth(endPosition.x()-startPosition.x());
        selectBox.setHeight(endPosition.y()-startPosition.y());
        buttonMove=false;
    }
    if(clickTwo)
    {
        num++;
    }
}

键盘输入的代码设计:

void Widget::keyPressEvent(QKeyEvent  *event)
{

     if(event->key()==Qt::Key_S)
    {
         this->resize(1920,1080);

    }
     if(event->key()==Qt::Key_P)
     {
         this->resize(1,1);
     }
     if(event->key()==Qt::Key_C)
     {
         this->close();
     }

}

最终软件下载地址:https://download.csdn.net/download/qq_43187232/20082597

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值