前两天学习了绘图,就想着做个截图工具练练手。
首先先想一下思路:
如何隐藏主窗口?
1.使用定时器延时1s
2.发送信号
hide()
如果隐藏完毕发送信号
接受信号后保存截图
1.全屏截图
// 保存整个屏幕为QPixmap
QScreen *screen = QGuiApplication::primaryScreen();
fullarea = screen->grabWindow(0);
2.区域截图
1、触发截图(快捷键或单击图标)
2、截取全屏画面
3、显示画布,去窗口表框
画布全屏:
hua.showFullScreen();//全屏显示
画布置顶:setWindowFlags(Qt::WindowStaysOnTopHint); //窗口置顶
4、通过重写鼠标和绘图函数来达到显示鼠标拖动区间,
5、截取鼠标拖动区间图案,弹出保存选项
6、退出
下面是效果图:
功能可全屏截图,可区域截图,用了定时器来实现隐藏窗口延时。
全屏截图代码:
void Widget::on_pushButton_clicked()//全屏截图
{
if(ui->checkBox->isChecked())//如果隐藏
{
this->hide();
if(timer->isActive()==false)
{
timer->start(1000);//隐藏后延迟1s
}
}
else//不隐藏
{
fulljietu();//抓屏
savepicture(); //保存
}
}
区域截图代码:
用鼠标事件和绘图事件进行裁剪
//按下鼠标
void huabu::mousePressEvent(QMouseEvent *e)
{
if(e->button()&Qt::LeftButton)
{
mStartPoint=e->pos();//
repaint();
}
}
//移动鼠标
void huabu::mouseMoveEvent(QMouseEvent *e)
{
mEndPoint=e->pos();
repaint();
}
//释放鼠标
void huabu::mouseReleaseEvent(QMouseEvent *e)
{
if(e->button()&Qt::LeftButton)
{
mEndPoint=e->pos();
GetScreenShot();//裁剪
// repaint();
}
}
void huabu::GetScreenShot()//裁剪
{
regionarea = fullarea.copy(mStartPoint.x(),mStartPoint.y(),
mEndPoint.x() - mStartPoint.x(),mEndPoint.y()-mStartPoint.y());
QString savepath=QFileDialog::getSaveFileName(
this,
"保存",
"../",
"PNG Files(*.png);;JPG Files(*.jpg);");
qDebug()<<savepath;
if(!regionarea.save(savepath))
{
qDebug()<<"save failed";
close();
}else
{
qDebug()<<"save success";
close();
}
}
void huabu::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.drawPixmap(0,0,width(),height(),fullarea);
QPen pen(Qt::blue);
p.setPen(pen);
p.drawRect(QRect(mStartPoint, mEndPoint) );
//******************************************向日葵头像
// QPainter p(this);//创建画家对象
// p.drawPixmap(180,70,150,150,QPixmap("../image/01.png"));
}
存在代码优化还没完成
保存图片的代码重复了,可以写一个信号去调用
还有什么问题,欢迎大家提出交流!!!
项目我已经上传了
下面是项目代码链接:
https://download.csdn.net/download/weixin_44353958/11601868