Qt学习笔记—简单全屏截图实现

相关函数

[static] QDesktopWidget *QApplication::desktop()   
Returns the desktop widget (also called the root window).
//获取桌面窗口的方法,通过此方法可以进一步获取桌面窗口的wId
bool QPixmap::save(QIODevice *device, const char *format = Q_NULLPTR, int quality = -1) const
//保存文件
QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
//等比例缩放
[static] QPixmap QPixmap::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)
//获取屏幕图像

简单全屏截图实现

#ifndef IMAGECAPTURE_H
#define IMAGECAPTURE_H


#include <QWidget>
#include <QPixmap>
#include <QTimer>
#include <windows.h>

namespace Ui {
    
    
class ImageCapture;
}

class ImageCapture : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit ImageCapture(QWidget *parent = 0);
    ~ImageCapture();
    
    void contextMenuEvent(QContextMenuEvent *event);  //右键快捷菜单事件
    
public slots:
    void startCapture(void);
    void showCapture(void);
    void saveImage(void);
private:
    Ui::ImageCapture *ui;
    QPixmap *capturePixMap;
    QTimer *timer;
};

#endif // IMAGECAPTURE_H
#include "imagecapture.h"
#include "ui_imagecapture.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QDir>
#include <QFileDialog>
#include <QDebug>
#include <windows.h>
#include <QMenu>
#include <QAction>
#include <QContextMenuEvent>

ImageCapture::ImageCapture(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ImageCapture)
{
    
    
    ui->setupUi(this);

    setWindowTitle("截图");

    capturePixMap = new QPixmap;
    timer = new QTimer;

    connect(ui->newPushButton, &QPushButton::clicked, this, &ImageCapture::startCapture);
    connect(ui->savePushButton, &QPushButton::clicked, this, &ImageCapture::saveImage);
    connect(ui->exitPushButton, &QPushButton::clicked, this, &ImageCapture::close);

    connect(this->timer, &QTimer::timeout, this, &ImageCapture::showCapture);
}

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

void ImageCapture::startCapture(void)
{
    
    
    this->hide();            //隐藏窗口
    timer->start(500);
}

void ImageCapture::showCapture(void)
{
    
    
    timer->stop();
    *capturePixMap = QPixmap::grabWindow(QApplication::desktop()->winId()); //全屏截图
    ui->imageLabel->setPixmap(capturePixMap->scaled(ui->imageLabel->size())); //按imageLabel比例缩放
    this->show();   // 显示窗口
}

void ImageCapture::saveImage(void)
{
    
    
    //QDir::currentPath()保存文件到当前路径下
    QString fileName = QFileDialog::getSaveFileName(this, tr("保存截图"), QDir::currentPath(), tr("image(*.png)"));

    capturePixMap->save(fileName);       //保存图片

    this->close();
}

//右键会触发快捷菜单时间
void ImageCapture::contextMenuEvent(QContextMenuEvent *event)
{
    
    
    QMenu *menu = new QMenu(this);   //创建一个菜单
    QAction *saveAction = new QAction("保存", this); //给菜单添加动作
    QAction *saveAsAction = new QAction("另存", this);
    menu->addAction(saveAction);
    menu->addAction(saveAsAction);

    connect(saveAction, &QAction::triggered, this, &ImageCapture::saveImage);   //关联保存图片的槽和菜单动作
    connect(saveAsAction, &QAction::triggered, this, &ImageCapture::saveImage);
//    menu->show();
    menu->exec(QCursor::pos());   // 在当前鼠标的位置 显示右键菜单 
}

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/108076852