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

本文主要是介绍QT 模仿QQ的截图框 支持基本的拖拉 移动 固定大小 可以复制到剪贴板和保存到文件中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#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();//获取了当前屏幕并存储在pixmapscreen=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);}elsereturn;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



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

 

效果图如下

这篇关于QT 模仿QQ的截图框 支持基本的拖拉 移动 固定大小 可以复制到剪贴板和保存到文件中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654642

相关文章

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho