QT 模仿QQ的截图框 支持基本的拖拉 移动 固定大小 可以复制到剪贴板和保存到文件中

来源:互联网 发布:暗黑破坏神3 数据库 编辑:程序博客网 时间:2024/05/01 10:45
#include "widget.h"#include "InputDialog.h"#include <QtGui>Widget::Widget(QWidget *parent,QColor selectedColor,int quality)    : QDialog(parent),quality(quality),sColor(selectedColor){    saveAt=new QAction(tr("保存到文件"),this);    saveAt->setIcon(QIcon(":/image/save.png"));    saveTob=new QAction(tr("保存到剪贴板"),this);    saveTob->setIcon(QIcon(":/image/savetob.png"));    closeAt=new QAction(tr("退出"),this);    closeAt->setIcon(QIcon(":/image/quit.png"));    helpAt=new QAction(tr("使用帮助"),this);    helpAt->setIcon(QIcon(":/image/help.png"));    fixedSizeAt=new QAction(tr("设置固定尺寸"),this);    fixedSizeAt->setIcon(QIcon(":/image/fixedsize.png"));    menu=new QMenu(tr("截图菜单"),this);    menu->setStyleSheet("background-image:url(:/image/back.png);color:white");    menu->addAction(saveAt);    menu->addAction(saveTob);    menu->addSeparator();    menu->addAction(fixedSizeAt);    menu->addSeparator();    menu->addAction(helpAt);    menu->addSeparator();    menu->addAction(closeAt);    connect(saveAt,SIGNAL(triggered()),this,SLOT(saveImage()));    connect(saveTob,SIGNAL(triggered()),this,SLOT(saveBoard()));    connect(closeAt,SIGNAL(triggered()),this,SLOT(close()));    connect(helpAt,SIGNAL(triggered()),this,SLOT(emitHelp()));    connect(fixedSizeAt,SIGNAL(triggered()),this,SLOT(input()));    this->setMouseTracking(true);    leftPressed=rightPressed=runOnce=done=pull=bresize=showm=false;    fullSize=QApplication::desktop()->size();    this->resize(fullSize);    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);    //this->hide();    //获取了当前屏幕并存储在pixmap    screen=new QPixmap(QPixmap::grabWindow(QApplication::desktop()->winId(),                                           0,0,fullSize.width(),fullSize.height()));    //新建一层朦胧屏幕    fogPix=new QPixmap(*screen);    QPixmap fog(fullSize.width(),fullSize.height());    fog.fill(QColor(182,182,182,192));    QPainter painter(fogPix);    painter.drawPixmap(0,0,fog);    painter.setPen(QPen(QColor(255,255,0)));    painter.drawText(fullSize.width()/2-50,50,tr("如需使用帮助,请按F1"));}void Widget::paintEvent(QPaintEvent *e){    QPainter painter(this);    QPen pen;    pen.setColor(Qt::yellow);    pen.setWidth(1);    painter.setPen(pen);    painter.drawPixmap(0,0,*fogPix);    QPainter painterInfo(this);    if(pos.tlp.x()!=pos.brp.x()&&            pos.tlp.y()!=pos.brp.y())    {        QPoint zPoint(1,1);        painterInfo.setPen(QPen(sColor));        painterInfo.drawRect(QRect(pos.tlp-zPoint,pos.brp));        painterInfo.drawRect(pos.tlp.x()-3,pos.tlp.y()-3,3,3);        painterInfo.drawRect(pos.trp.x(),pos.trp.y()-3,3,3);        painterInfo.drawRect(pos.blp.x()-3,pos.blp.y()+1,3,3);        painterInfo.drawRect(pos.brp.x()+1,pos.brp.y()+1,3,3);        painterInfo.drawRect((pos.tlp.x()+pos.trp.x())/2-2,                             (pos.tlp.y()-4),3,3);        painterInfo.drawRect(pos.tlp.x()-4,                             (pos.tlp.y()+pos.blp.y())/2-2,3,3);        painterInfo.drawRect(pos.trp.x()+1,                             (pos.trp.y()+pos.brp.y())/2-2,3,3);        painterInfo.drawRect((pos.blp.x()+pos.brp.x())/2-2,                             pos.blp.y()+1,3,3);        painterInfo.drawPixmap(pos.tlp,                               screen->copy(QRect(pos.tlp,pos.brp)));        painterInfo.setBrush(QBrush(QColor(200,200,200,165)));        painterInfo.setPen(QPen(QColor(200,200,200,165)));        painterInfo.drawRect(pos.tlp.x(),pos.tlp.y()>=40?                                 pos.tlp.y()-40:pos.tlp.y(),150,40);        painterInfo.setPen(QPen(Qt::black));        painterInfo.drawText(pos.tlp.x()+10,                            pos.tlp.y()>=40?pos.tlp.y()-25:pos.tlp.y()+15,                             tr("截图开始坐标(%1,%2)").arg(QString::number(pos.tlp.x()),                                                     QString::number(pos.tlp.y())));        painterInfo.drawText(pos.tlp.x()+10,                             pos.tlp.y()>=40?pos.tlp.y()-10:pos.tlp.y()+30,                             tr("截图尺寸大小(%1,%2)").arg(QString::number(pos.brp.x()-pos.tlp.x()),                                                     QString::number(pos.brp.y()-pos.tlp.y())));    }    else    {        cursor.setShape(Qt::ArrowCursor);        this->setCursor(cursor);    }}void Widget::mousePressEvent(QMouseEvent *e){    if(e->button()==Qt::LeftButton)    {        leftPressed=true;        if(!(e->globalPos().x()>pos.tlp.x()&&             e->globalPos().y()>pos.tlp.y()&&             e->globalPos().x()<pos.brp.x()&&             e->globalPos().y()<pos.brp.y())&&                !(e->globalPos().x()>=pos.tlp.x()-5&&                  e->globalPos().x()<=pos.tlp.x()-1&&                  e->globalPos().y()>=pos.tlp.y()-5&&                  e->globalPos().y()<=pos.tlp.y()-1)&&                !(e->globalPos().x()>=pos.trp.x()+1&&                  e->globalPos().x()<=pos.trp.x()+5&&                  e->globalPos().y()<=pos.trp.y()+1&&                  e->globalPos().y()>=pos.trp.y()-5)&&                !(e->globalPos().x()>=pos.blp.x()-5&&                  e->globalPos().x()<=pos.blp.x()-1&&                  e->globalPos().y()<=pos.blp.y()+5&&                  e->globalPos().y()>=pos.blp.y()+1)&&                !(e->globalPos().x()>=pos.brp.x()+1&&                  e->globalPos().x()<=pos.brp.x()+5&&                  e->globalPos().y()>=pos.brp.y()+1&&                  e->globalPos().y()<=pos.brp.y()+5)&&                !((e->globalPos().x()>=(pos.tlp.x()+pos.trp.x())/2-2&&                   e->globalPos().x()<=(pos.tlp.x()+pos.trp.x())/2+2&&                   e->globalPos().y()<=pos.tlp.y()-1&&                   e->globalPos().y()>=pos.tlp.y()-4))&&                !(e->globalPos().x()>=pos.tlp.x()-4&&                  e->globalPos().x()<=pos.tlp.x()-1&&                  e->globalPos().y()>=(pos.tlp.y()+pos.blp.y())/2-2&&                  e->globalPos().y()<=(pos.tlp.y()+pos.blp.y())/2+2)&&                !(e->globalPos().x()>=(pos.blp.x()+pos.brp.x())/2-2&&                 e->globalPos().x()<=(pos.blp.x()+pos.brp.x())/2+2&&                 e->globalPos().y()>=pos.blp.y()+1&&                 e->globalPos().y()<=pos.blp.y()+4)&&                !(e->globalPos().x()>=pos.trp.x()+1&&                                e->globalPos().x()<=pos.trp.x()+4&&                                e->globalPos().y()>=(pos.trp+pos.brp).y()/2-2&&                                e->globalPos().y()<=(pos.trp+pos.brp).y()/2+2)) //不在所选的区域内        {            p1=e->globalPos();            done=false;        }        if((e->globalPos().x()>pos.tlp.x()&&            e->globalPos().y()>pos.tlp.y()&&            e->globalPos().x()<pos.brp.x()&&            e->globalPos().y()<pos.brp.y()))        {            pull=true;        }        if(e->globalPos().x()>=pos.tlp.x()-5&&                e->globalPos().x()<=pos.tlp.x()-1&&                e->globalPos().y()>=pos.tlp.y()-5&&                e->globalPos().y()<=pos.tlp.y()-1)        {            bresize=true;            moved=1;        }        if(e->globalPos().x()>=pos.trp.x()+1&&                e->globalPos().x()<=pos.trp.x()+5&&                e->globalPos().y()<=pos.trp.y()+1&&                e->globalPos().y()>=pos.trp.y()-5)        {            bresize=true;            moved=2;        }        if(e->globalPos().x()>=pos.blp.x()-5&&                e->globalPos().x()<=pos.blp.x()-1&&                e->globalPos().y()<=pos.blp.y()+5&&                e->globalPos().y()>=pos.blp.y()+1)        {            bresize=true;            moved=3;        }        if(e->globalPos().x()>=pos.brp.x()+1&&                e->globalPos().x()<=pos.brp.x()+5&&                e->globalPos().y()>=pos.brp.y()+1&&                e->globalPos().y()<=pos.brp.y()+5)        {            bresize=true;            moved=4;        }        if(e->globalPos().x()>=(pos.tlp.x()+pos.trp.x())/2-2&&                e->globalPos().x()<=(pos.tlp.x()+pos.trp.x())/2+2&&                e->globalPos().y()<=pos.tlp.y()-1&&                e->globalPos().y()>=pos.tlp.y()-4)        {            bresize=true;            moved=5;        }        if(e->globalPos().x()>=pos.tlp.x()-4&&                e->globalPos().x()<=pos.tlp.x()-1&&                e->globalPos().y()>=(pos.tlp.y()+pos.blp.y())/2-2&&                e->globalPos().y()<=(pos.tlp.y()+pos.blp.y())/2+2)        {            bresize=true;            moved=6;        }        if(e->globalPos().x()>=(pos.blp.x()+pos.brp.x())/2-2&&                e->globalPos().x()<=(pos.blp.x()+pos.brp.x())/2+2&&                e->globalPos().y()>=pos.blp.y()+1&&                e->globalPos().y()<=pos.blp.y()+4)        {            bresize=true;            moved=8;        }        if(e->globalPos().x()>=pos.trp.x()+1&&                e->globalPos().x()<=pos.trp.x()+4&&                e->globalPos().y()>=(pos.trp+pos.brp).y()/2-2&&                e->globalPos().y()<=(pos.trp+pos.brp).y()/2+2)        {            bresize=true;            moved=7;        }    }    else if(e->button()==Qt::RightButton)    {        if(!(e->globalPos().x()>pos.tlp.x()&&             e->globalPos().y()>pos.tlp.y()&&             e->globalPos().x()<pos.brp.x()&&             e->globalPos().y()<pos.brp.y())&&                !(e->globalPos().x()>=pos.tlp.x()-5&&                  e->globalPos().x()<=pos.tlp.x()-1&&                  e->globalPos().y()>=pos.tlp.y()-5&&                  e->globalPos().y()<=pos.tlp.y()-1)&&                !(e->globalPos().x()>=pos.trp.x()+1&&                  e->globalPos().x()<=pos.trp.x()+5&&                  e->globalPos().y()<=pos.trp.y()+1&&                  e->globalPos().y()>=pos.trp.y()-5)&&                !(e->globalPos().x()>=pos.blp.x()-5&&                  e->globalPos().x()<=pos.blp.x()-1&&                  e->globalPos().y()<=pos.blp.y()+5&&                  e->globalPos().y()>=pos.blp.y()+1)&&                !(e->globalPos().x()>=pos.brp.x()+1&&                  e->globalPos().x()<=pos.brp.x()+5&&                  e->globalPos().y()>=pos.brp.y()+1&&                  e->globalPos().y()<=pos.brp.y()+5)&&                !(e->globalPos().x()>=(pos.tlp.x()+pos.trp.x())/2-2&&                  e->globalPos().x()<=(pos.tlp.x()+pos.trp.x())/2+2&&                  e->globalPos().y()<=pos.tlp.y()-1&&                  e->globalPos().y()>=pos.tlp.y()-4)&&                !(e->globalPos().x()>=pos.tlp.x()-4&&                  e->globalPos().x()<=pos.tlp.x()-1&&                  e->globalPos().y()>=(pos.tlp.y()+pos.blp.y())/2-2&&                  e->globalPos().y()<=(pos.tlp.y()+pos.blp.y())/2+2)&&                !(e->globalPos().x()>=(pos.blp.x()+pos.brp.x())/2-2&&                 e->globalPos().x()<=(pos.blp.x()+pos.brp.x())/2+2&&                 e->globalPos().y()>=pos.blp.y()+1&&                 e->globalPos().y()<=pos.blp.y()+4)&&                !(e->globalPos().x()>=pos.trp.x()+1&&                                e->globalPos().x()<=pos.trp.x()+4&&                                e->globalPos().y()>=(pos.trp+pos.brp).y()/2-2&&                                e->globalPos().y()<=(pos.trp+pos.brp).y()/2+2)) //不在所选的区域内        {            this->reset();            done=false;            leftPressed=false;            rightPressed=false;            runOnce=false;            bresize=false;            pull=false;            showm=false;            this->update();        }        else        {            showm=true;        }    }}void Widget::mouseMoveEvent(QMouseEvent *e){    if(leftPressed)    {        if(!done)        {            p2.setX(e->globalPos().x());            p2.setY(e->globalPos().y());            this->figPos(p1,p2);            this->update();        }        if(bresize)        {            if(moved==1)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.tlp.x()+(e->globalPos().x()-start.x())<pos.brp.x()&&                        pos.tlp.y()+(e->globalPos().y()-start.y())<pos.brp.y())                {                    pos.tlp.setX(pos.tlp.x()+(e->globalPos().x()-start.x()));                    pos.tlp.setY(pos.tlp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.tlp,pos.brp);                }                start=e->globalPos();                this->update();            }            else if(moved==2)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.trp.x()+(e->globalPos().x()-start.x())>pos.blp.x()&&                        pos.trp.y()+(e->globalPos().y()-start.y())<pos.blp.y())                {                    pos.trp.setX(pos.trp.x()+(e->globalPos().x()-start.x()));                    pos.trp.setY(pos.trp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.trp,pos.blp);                }                start=e->globalPos();                this->update();            }            else if(moved==3)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.blp.x()+(e->globalPos().x()-start.x())<pos.trp.x()&&                       pos.blp.y()+(e->globalPos().y()-start.y())>pos.trp.y())                {                    pos.blp.setX(pos.blp.x()+(e->globalPos().x()-start.x()));                    pos.blp.setY(pos.blp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.blp,pos.trp);                }                start=e->globalPos();                this->update();            }            else if(moved==4)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.brp.x()+(e->globalPos().x()-start.x())>pos.tlp.x()&&                        pos.brp.y()+(e->globalPos().y()-start.y())>pos.tlp.y())                {                    pos.brp.setX(pos.brp.x()+(e->globalPos().x()-start.x()));                    pos.brp.setY(pos.brp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.brp,pos.tlp);                }                start=e->globalPos();                this->update();            }            else if(moved==5)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.tlp.y()+(e->globalPos().y()-start.y())<pos.blp.y())                {                    pos.tlp.setY(pos.tlp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.tlp,pos.brp);                }                start=e->globalPos();                this->update();            }            else if(moved==6)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if((pos.tlp.x()+(e->globalPos()-start).x())<pos.brp.x())                {                    pos.tlp.setX(pos.tlp.x()+(e->globalPos().x()-start.x()));                    this->figPos(pos.tlp,pos.brp);                }                start=e->globalPos();                this->update();            }            else if(moved==8)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if(pos.blp.y()+(e->globalPos().y()-start.y())>pos.tlp.y())                {                    pos.blp.setY(pos.blp.y()+(e->globalPos().y()-start.y()));                    this->figPos(pos.blp,pos.trp);                }                start=e->globalPos();                this->update();            }            else if(moved=7)            {                if(!runOnce)                {                    start=e->globalPos();                    runOnce=true;                }                if((pos.trp.x()+(e->globalPos()-start).x())>pos.blp.x())                {                    pos.trp.setX(pos.trp.x()+(e->globalPos().x()-start.x()));                    this->figPos(pos.trp,pos.blp);                }                start=e->globalPos();                this->update();            }        }        if(pull)        {            if(!runOnce)            {                start=e->globalPos();                runOnce=true;            }            if(pos.tlp.x()+e->globalPos().x()-start.x()>0&&                    pos.tlp.x()+e->globalPos().x()-start.x()<=fullSize.width()&&                    pos.tlp.y()+e->globalPos().y()-start.y()>0&&                    pos.tlp.y()+e->globalPos().y()-start.y()<=fullSize.height()&&                    pos.brp.x()+e->globalPos().x()-start.x()>=0&&                    pos.brp.x()+e->globalPos().x()-start.x()<fullSize.width()&&                    pos.brp.y()+e->globalPos().y()-start.y()>=0&&                    pos.brp.y()+e->globalPos().y()-start.y()<=fullSize.height())            {                pos.tlp+=(e->globalPos()-start);                pos.brp+=(e->globalPos()-start);                this->figPos(pos.tlp,pos.brp);            }            else if(pos.tlp.x()+e->globalPos().x()-start.x()<=0&&                    pos.blp.y()+e->globalPos().y()-start.y()<=fullSize.height()&&                    pos.tlp.y()+e->globalPos().y()-start.y()>=0)//左边            {                pos.tlp.setX(0);                pos.tlp.setY(pos.tlp.y()+e->globalPos().y()-start.y());                pos.brp.setX(pos.brp.x()-pos.blp.x());                pos.brp.setY(pos.brp.y()+e->globalPos().y()-start.y());                this->figPos(pos.tlp,pos.brp);            }            else if(pos.tlp.y()+e->globalPos().y()-start.y()<=0&&                    pos.tlp.x()+e->globalPos().x()-start.x()>=0&&                    pos.trp.x()+e->globalPos().x()-start.x()<=fullSize.width())//上            {                pos.tlp.setY(0);                pos.tlp.setX(pos.tlp.x()+e->globalPos().x()-start.x());                pos.brp.setX(pos.brp.x()+e->globalPos().x()-start.x());                pos.brp.setY(pos.tlp.y()+pos.blp.y()-pos.trp.y());                this->figPos(pos.tlp,pos.brp);            }            else if(pos.brp.x()+e->globalPos().x()-start.x()>=fullSize.width()&&                    pos.trp.y()+e->globalPos().y()-start.y()>=0&&                    pos.brp.y()+e->globalPos().y()-start.y()<=fullSize.height())//右            {                pos.brp.setX(fullSize.width());                pos.brp.setY(pos.brp.y()+e->globalPos().y()-start.y());                pos.tlp.setX(fullSize.width()-(pos.trp.x()-pos.blp.x()));                pos.tlp.setY(pos.tlp.y()+e->globalPos().y()-start.y());                this->figPos(pos.tlp,pos.brp);            }            else if(pos.brp.y()+e->globalPos().y()-start.y()>=fullSize.height()&&                    pos.brp.x()+e->globalPos().x()-start.x()<=fullSize.width()&&                    pos.blp.x()+e->globalPos().x()-start.x()>=0)//下            {                pos.brp.setY(fullSize.height());                pos.brp.setX(pos.brp.x()+e->globalPos().x()-start.x());                pos.tlp.setX(pos.tlp.x()+e->globalPos().x()-start.x());                pos.tlp.setY(pos.brp.y()-(pos.blp.y()-pos.trp.y()));                this->figPos(pos.tlp,pos.brp);            }            start=e->globalPos();            this->update();        }    }    else    {        if(e->globalPos().x()>=pos.tlp.x()-5&&                e->globalPos().x()<=pos.tlp.x()-1&&                e->globalPos().y()>=pos.tlp.y()-5&&                e->globalPos().y()<=pos.tlp.y()-1)        {            cursor.setShape(Qt::SizeFDiagCursor);            this->setCursor(cursor);        }        else if((e->globalPos().x()>pos.tlp.x()&&                 e->globalPos().y()>pos.tlp.y()&&                 e->globalPos().x()<pos.brp.x()&&                 e->globalPos().y()<pos.brp.y()))        {            cursor.setShape(Qt::SizeAllCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=pos.trp.x()+1&&                e->globalPos().x()<=pos.trp.x()+5&&                e->globalPos().y()<=pos.trp.y()+1&&                e->globalPos().y()>=pos.trp.y()-5)        {            cursor.setShape(Qt::SizeBDiagCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=pos.blp.x()-5&&                e->globalPos().x()<=pos.blp.x()-1&&                e->globalPos().y()<=pos.blp.y()+5&&                e->globalPos().y()>=pos.blp.y()+1)        {            cursor.setShape(Qt::SizeBDiagCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=pos.brp.x()+1&&                e->globalPos().x()<=pos.brp.x()+5&&                e->globalPos().y()>=pos.brp.y()+1&&                e->globalPos().y()<=pos.brp.y()+5)        {            cursor.setShape(Qt::SizeFDiagCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=(pos.tlp.x()+pos.trp.x())/2-2&&                e->globalPos().x()<=(pos.tlp.x()+pos.trp.x())/2+2&&                e->globalPos().y()<=pos.tlp.y()-1&&                e->globalPos().y()>=pos.tlp.y()-4)        {            cursor.setShape(Qt::SizeVerCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=pos.tlp.x()-4&&                e->globalPos().x()<=pos.tlp.x()-1&&                e->globalPos().y()>=(pos.tlp.y()+pos.blp.y())/2-2&&                e->globalPos().y()<=(pos.tlp.y()+pos.blp.y())/2+2)        {            cursor.setShape(Qt::SizeHorCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=(pos.blp.x()+pos.brp.x())/2-2&&                e->globalPos().x()<=(pos.blp.x()+pos.brp.x())/2+2&&                e->globalPos().y()>=pos.blp.y()+1&&                e->globalPos().y()<=pos.blp.y()+4)        {            cursor.setShape(Qt::SizeVerCursor);            this->setCursor(cursor);        }        else if(e->globalPos().x()>=pos.trp.x()+1&&                e->globalPos().x()<=pos.trp.x()+4&&                e->globalPos().y()>=(pos.trp+pos.brp).y()/2-2&&                e->globalPos().y()<=(pos.trp+pos.brp).y()/2+2)        {            cursor.setShape(Qt::SizeHorCursor);            this->setCursor(cursor);        }        else        {            QCursor cursor;            cursor.setShape(Qt::ArrowCursor);            this->setCursor(cursor);        }    }    if(rightPressed)    {    }}void Widget::mouseReleaseEvent(QMouseEvent *e){    leftPressed=false;    runOnce=false;    done=true;    bresize=false;    pull=false;    if(e->button()==Qt::RightButton)    {        if(!(e->globalPos().x()>pos.tlp.x()&&             e->globalPos().y()>pos.tlp.y()&&             e->globalPos().x()<pos.brp.x()&&             e->globalPos().y()<pos.brp.y())&&                !(e->globalPos().x()>=pos.tlp.x()-5&&                  e->globalPos().x()<=pos.tlp.x()-1&&                  e->globalPos().y()>=pos.tlp.y()-5&&                  e->globalPos().y()<=pos.tlp.y()-1)&&                !(e->globalPos().x()>=pos.trp.x()+1&&                  e->globalPos().x()<=pos.trp.x()+5&&                  e->globalPos().y()<=pos.trp.y()+1&&                  e->globalPos().y()>=pos.trp.y()-5)&&                !(e->globalPos().x()>=pos.blp.x()-5&&                  e->globalPos().x()<=pos.blp.x()-1&&                  e->globalPos().y()<=pos.blp.y()+5&&                  e->globalPos().y()>=pos.blp.y()+1)&&                !(e->globalPos().x()>=pos.brp.x()+1&&                  e->globalPos().x()<=pos.brp.x()+5&&                  e->globalPos().y()>=pos.brp.y()+1&&                  e->globalPos().y()<=pos.brp.y()+5))        {}        else        {            if(showm)            {                menu->exec(e->globalPos());            }        }    }    rightPressed=false;    showm=false;    //cursor.setShape(Qt::ArrowCursor);    //this->setCursor(cursor);}void Widget::keyPressEvent(QKeyEvent *e){    switch(e->key())    {    case Qt::Key_Left:        if(pos.tlp.x()-1>=0)        {            pos.tlp.setX(pos.tlp.x()-1);            pos.brp.setX(pos.brp.x()-1);        }        break;    case Qt::Key_Right:        if(pos.blp.x()+1<=fullSize.width())        {            pos.tlp.setX(pos.tlp.x()+1);            pos.brp.setX(pos.brp.x()+1);            this->figPos(pos.tlp,pos.brp);        }        break;    case Qt::Key_Up:        if(pos.tlp.y()-1>=0)        {            pos.tlp.setY(pos.tlp.y()-1);            pos.brp.setY(pos.brp.y()-1);            this->figPos(pos.tlp,pos.brp);        }        break;    case Qt::Key_Down:        if(pos.brp.y()+1<=fullSize.height())        {            pos.tlp.setY(pos.tlp.y()+1);            pos.brp.setY(pos.brp.y()+1);            this->figPos(pos.tlp,pos.brp);        }        break;    case Qt::Key_Enter:        this->saveImage();        break;    case Qt::Key_Escape:        this->close();        this->destroy();        emit closed();        break;    case Qt::Key_Space:        this->saveBoard();    default:        break;    }    this->update();}void Widget::saveImage(){    QString slcStr;    QPoint end=pos.brp;    end.setX(end.x()-1);    end.setY(end.y()-1);    fileName=QFileDialog::getSaveFileName(this,tr("保存截图"),                                              "c:/untitled.png",                                              tr("PNG(*.png);;JPG(*.jpg);;BMP(*.bmp)"),&slcStr);    if(slcStr.left(3)=="JPG")    {        if(fileName.right(3)!="jpg")        {            fileName+=".jpg";        }    }    if(slcStr.left(3)=="PNG")    {        if(fileName.right(3)!="png")        {            fileName+=".png";        }    }    if(slcStr.left(3)=="BMP")    {        if(fileName.right(3)!="bmp")        {            fileName+=".bmp";        }    }    if(!fileName.isEmpty())    {        file=new QFile(fileName);    }    else        return;    QFileInfo fileInfo(fileName);    QString ext=fileInfo.suffix();    if(file->open(QIODevice::WriteOnly))    {        screen->copy(QRect(pos.tlp,end)).save(file,ext.toStdString().c_str(),quality);        qDebug()<<ext;        file->close();    }    delete file;    this->close();}void Widget::saveBoard(){    QApplication::clipboard()->setImage(screen->copy(QRect(pos.tlp,pos.brp)).toImage());    this->close();}void Widget::reset(){    QPoint zeroP(0,0);    pos.blp=zeroP;    pos.brp=zeroP;    pos.tlp=zeroP;    pos.trp=zeroP;}void Widget::figPos(const QPoint& p1,const QPoint& p2){    if(p1.x()<p2.x()&&            p1.y()<p2.y())    {        pos.tlp=p1;        pos.trp.setX(p2.x());        pos.trp.setY(p1.y());        pos.blp.setX(p1.x());        pos.blp.setY(p2.y());        pos.brp=p2;    }    else if(p1.x()>p2.x()&&            p1.y()<p2.y())    {        pos.tlp.setX(p2.x());        pos.tlp.setY(p1.y());        pos.trp=p1;        pos.blp=p2;        pos.brp.setX(p1.x());        pos.brp.setY(p2.y());    }    else if(p1.x()<p2.x()&&            p1.y()>p2.y())    {        pos.tlp.setX(p1.x());        pos.tlp.setY(p2.y());        pos.trp=p2;        pos.brp=p1;        pos.brp.setX(p2.x());        pos.brp.setY(p1.y());    }    else if(p1.x()>p2.x()&&            p1.y()>p2.y())    {        pos.tlp=p2;        pos.trp.setX(p1.x());        pos.trp.setY(p2.y());        pos.blp.setX(p2.x());        pos.blp.setY(p1.y());        pos.brp=p1;    }}void Widget::mouseDoubleClickEvent(QMouseEvent *e){    if(e->button()==Qt::LeftButton&&            (e->globalPos().x()>pos.tlp.x()&&             e->globalPos().y()>pos.tlp.y()&&             e->globalPos().x()<pos.brp.x()&&             e->globalPos().y()<pos.brp.y()))    {        this->saveBoard();    }}void Widget::emitHelp(){    emit showHelp();}void Widget::keyReleaseEvent(QKeyEvent *e){    switch(e->key())    {    case Qt::Key_F1:        emit emitHelp();        break;    default:        QDialog::keyReleaseEvent(e);        break;    }}void Widget::setMySize(int n1, int n2){    if(n1!=0)    {        if(pos.tlp.x()+n1>=fullSize.width())        {            pos.brp.setX(fullSize.width());        }        else        {            pos.brp.setX(pos.tlp.x()+n1);        }        this->figPos(pos.tlp,pos.brp);        this->update();    }    if(n2!=0)    {        if(pos.tlp.y()+n2>=fullSize.height())        {            pos.brp.setY(fullSize.height());        }        else        {            pos.brp.setY(pos.tlp.y()+n2);        }        this->figPos(pos.tlp,pos.brp);        this->update();    }}void Widget::input(){    InputDialog id(0);    connect(&id,SIGNAL(input(int,int)),this,SLOT(setMySize(int,int)));    id.exec();}

 

#ifndef WIDGET_H#define WIDGET_H#include <QtGui/QDialog>#include <QSize>#include <QPoint>#include <QCursor>#include <QColor>class QFile;class QPixmap;class QMenu;class QAction;class Widget : public QDialog{    Q_OBJECTpublic:    struct posInfo    {        QPoint tlp,                trp,                blp,                brp;    };    QPoint p1,p2;    Widget(QWidget *parent = 0,QColor selectedColor=QColor(0,0,255),int quality=-1);    ~Widget(){delete screen;delete fogPix;}    void reset();private:    QPixmap *screen,            *fogPix;    posInfo pos;    bool rightPressed,        leftPressed,        done,        pull;    int moved;    bool runOnce;    bool bresize;    bool showm;    QColor sColor;    QPoint start;    QString fileName;    QFile *file;    QSize fullSize;    QCursor cursor;    QMenu *menu;    QAction *saveAt,            *closeAt,            *saveTob,            *helpAt,            *fixedSizeAt;    int quality;    void figPos(const QPoint&,const QPoint&);protected:    void paintEvent(QPaintEvent *);    void mousePressEvent(QMouseEvent *);    void mouseMoveEvent(QMouseEvent *);    void mouseReleaseEvent(QMouseEvent *);    void keyPressEvent(QKeyEvent *);    void mouseDoubleClickEvent(QMouseEvent *);    void keyReleaseEvent(QKeyEvent *);private slots:    void saveImage();    void saveBoard();    void emitHelp();    void setMySize(int,int);    void input();signals:    void closed();    void showHelp();};#endif // WIDGET_H



其中其它的对话框可以都删掉

 

效果图如下

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 投标时措施费忘记套价了怎么办 美团商家更改手机号和银行卡怎么办 淘宝买的衣服颜色发错了怎么办 在淘宝买的衣服颜色不一样怎么办 新买的木柜气味好重怎么办 淘宝店铺动态评分一直很低怎么办? 刚生下来的宝宝睡觉不吃奶怎么办 宝宝吐奶咳嗽了可能被呛到怎么办 床下面的液压支架支撑不了了怎么办 沙发的海绵垫坐着感觉太硬怎么办 修公路占地补偿盖房子房产证怎么办 哺乳期乳房有硬块挤不出来怎么办 老公投的公司倒闭了钱怎么办 小丑鱼老在缸上边游不下去怎么办 海缸养珊瑚又想养蝴蝶鱼怎么办 被几个月的小狗咬了怎么办 木本植物继代长出大量愈伤怎么办 钱兜树叶子发黄掉叶怎么办 手机qq群200人满了怎么办 支票被背书人的章盖浅了怎么办 没病装病的心理病患者怎么办 20多岁被骗40多万怎么办 一个学生上课爱捣乱班级课堂怎么办 军训的时候大姨妈来了怎么办 笔记本连接无线网说链接限制怎么办 12306密码和邮箱都忘了怎么办 烦恼都是自找的新书散页了怎么办 白色衣服被红色衣服染了怎么办 手机微信里面不能拍手功怎么办 肇事逃逸轻伤且对方不私了怎么办 数学差怎么办脑子不好啊数学学不老 手机号丢失微信密码丢失怎么办找回 悦借钱输入五次密码被锁怎么办 生源地助学贷款密码忘了怎么办 生源地助学贷款登录密码忘了怎么办 助学贷款支付宝密码忘了怎么办 微信密码忘记了手机号也换了怎么办 换手机号了微信密码忘记了怎么办 qq密码忘记了手机号也换了怎么办 一年只能修改一次昵称我能怎么办 华为手机的账号和密码丢失怎么办