qt截图功能

1.头文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_WidgetTest4.h"
#include <QPaintEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QLabel>
#include <QToolBar>


class WidgetTest4 : public QWidget
{
    Q_OBJECT

public:
    WidgetTest4(QWidget *parent = Q_NULLPTR);
    void paintEvent(QPaintEvent*);          //绘图事件
    void mouseMoveEvent(QMouseEvent*);      //鼠标移动事件
    void mousePressEvent(QMouseEvent*);     //鼠标按下事件
    void keyPressEvent(QKeyEvent*);         //键盘按下事件
    void mouseReleaseEvent(QMouseEvent*);   //鼠标弹起事件
    void init();                            //初始化
    void createToolBar();                   //创建工具栏
    void connectSlots();                    //连接槽函数
private:
    Ui::WidgetTest4Class ui;
    QToolBar *m_pToolBar;   //工具栏
    QAction *m_pActSave;    //保存
    QAction *m_pActQuit;    //退出
    QAction* m_pFinish;     //完成

    QPoint m_ptFrist;   //第一次按下坐标
    QPoint m_ptEnd;     //结束点坐标
    bool m_bPress;      //是否按下
    QLabel* m_pLabel;   //坐标值
private slots:
    void saveFile();    //保存文件
    void quit();        //退出
    void finish();      //完成
};

2.源文件

#include "WidgetTest4.h"
#include <QPainter>
#include <QDesktopWidget>
#include <math.h>
#include <QScreen>
#include <QFileDialog>
#include <QWindow>
#include <QClipboard>
WidgetTest4::WidgetTest4(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    
    init();
    createToolBar();
    connectSlots();
    //设置主程序界面图片(截取屏幕图片)
    QString strPath = QCoreApplication::applicationDirPath();
    QScreen* screen = QGuiApplication::primaryScreen();
    screen->grabWindow(0).save(strPath + "/temp.bmp");
    QPalette palette = this->palette();
    QImage bkImage(strPath + "/temp.bmp");
    QImage fillBkImage = bkImage.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
    palette.setBrush(QPalette::Window, QBrush(fillBkImage));
    this->setPalette(palette);

}

void WidgetTest4::connectSlots()
{
    connect(m_pActSave, SIGNAL(triggered()), this, SLOT(saveFile()));
    connect(m_pActQuit, SIGNAL(triggered()), this, SLOT(quit()));
    connect(m_pFinish, SIGNAL(triggered()), this, SLOT(finish()));
}

void WidgetTest4::init()
{
    m_bPress = false;   //没有按下
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint); //设置窗体无标题栏
    QDesktopWidget* pDesktopWidget = QApplication::desktop();               //获取当前桌面
    //QRect deskRect = QApplication::desktop()->availableGeometry();        //获取可用桌面大小(不包含任务栏)
    QRect screenRect = QApplication::desktop()->screenGeometry();           //获取主屏幕分辨率(包含任务栏)
    resize(screenRect.width(), screenRect.height());                        //设置窗体大小

    //label的背景色和文字颜色
    m_pLabel = new QLabel(this);
    m_pLabel->setStyleSheet("QLabel {background-color: black;color:white;}");
}

void WidgetTest4::createToolBar()
{
    //工具条
    m_pToolBar = new QToolBar(this);
    m_pActSave = new QAction(QStringLiteral("保存"));
    m_pActQuit = new QAction(QStringLiteral("退出"));
    m_pFinish = new QAction(QStringLiteral("完成"));
    m_pToolBar->addAction(m_pActSave);
    m_pToolBar->addAction(m_pActQuit);
    m_pToolBar->addAction(m_pFinish);
    m_pToolBar->setStyleSheet("QToolBar {background-color: white;color:black;}");   //设置工具栏样式表
    m_pToolBar->setFixedSize(200, 40);  //设置工具栏固定大小
    m_pToolBar->hide();
}

void WidgetTest4::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    QPen pen(QColor(0, 0, 255));
    painter.setPen(pen);
    if (m_bPress == true)
    {
        //画矩形上的点
        QBrush brush(QColor(0, 0, 255));
        painter.setBrush(brush);
        painter.drawRect(m_ptFrist.x()-2, m_ptFrist.y()-2, 5, 5);   
        painter.drawRect(m_ptFrist.x()+(m_ptEnd.x() - m_ptFrist.x())/2-2, m_ptFrist.y()-2, 5, 5);
        painter.drawRect(m_ptEnd.x()-2, m_ptFrist.y()-2, 5, 5);
        painter.drawRect(m_ptFrist.x()-2, m_ptFrist.y()+(m_ptEnd.y()-m_ptFrist.y())/2-2, 5, 5);
        painter.drawRect(m_ptEnd.x()-2, m_ptFrist.y()+(m_ptEnd.y() - m_ptFrist.y()) / 2-2, 5, 5);
        painter.drawRect(m_ptFrist.x()-2, m_ptEnd.y()-2, 5, 5);
        painter.drawRect(m_ptFrist.x()+(m_ptEnd.x() - m_ptFrist.x()) / 2-2, m_ptEnd.y()-2, 5, 5);
        painter.drawRect(m_ptEnd.x()-2, m_ptEnd.y()-2, 5, 5);

        //画矩形
        QBrush brush1(Qt::NoBrush);     
        painter.setBrush(brush1);
        painter.drawRect(m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());   //鼠标移动画矩形   
        painter.setClipRect(m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
    }
}

void WidgetTest4::mouseMoveEvent(QMouseEvent* event)
{
    if (event->buttons() & Qt::LeftButton)  //左键按下移动
    {
        m_ptEnd = event->pos();
        int iWidth = m_ptEnd.x() - m_ptFrist.x();   //截取的宽度
        int iHeight = m_ptEnd.y() - m_ptFrist.y();  //截取的高度
        QString str = QString::number(abs(iWidth)) + "x" + QString::number(abs(iHeight));
        m_pLabel->setText(str); //鼠标移动实时显示大小
        m_pLabel->show();
        update();
    }
}

void WidgetTest4::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)  //左键按下
    {
        m_bPress = true;
        m_ptFrist = event->pos();   //记录左键点击的坐标

        if (m_ptFrist.x() < 80 || m_ptFrist.y() < 30)
        {
            m_pLabel->setGeometry(m_ptFrist.x(), m_ptFrist.y(), 80, 30);    //设置label的位置及大小
        }
        else
        {
            m_pLabel->setGeometry(m_ptFrist.x(), m_ptFrist.y()-30, 80, 30); //设置label的位置及大小
        }
    }
}

void WidgetTest4::keyPressEvent(QKeyEvent* event)
{
    if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_Q)) //组合键Ctrl+A
    {
        this->show();
        //设置主程序界面图片(截取主屏幕图片)
        QString strPath = QCoreApplication::applicationDirPath();
        QScreen* screen = QGuiApplication::primaryScreen();
        screen->grabWindow(0).save(strPath + "/temp.bmp");
        QPalette palette = this->palette();
        QImage bkImage(strPath + "/temp.bmp");
        QImage fillBkImage = bkImage.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
        palette.setBrush(QPalette::Window, QBrush(fillBkImage));
        this->setPalette(palette);
    }
    else if (event->key() == Qt::Key_Escape) {
        close();    //关闭窗口
    }
}

void WidgetTest4::mouseReleaseEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_pToolBar->setGeometry(m_ptEnd.x()-200, m_ptEnd.y(), m_ptEnd.x(), 30); //设置工具栏在指定位置
        m_pToolBar->show(); //显示工具栏
    }
}

void WidgetTest4::saveFile()
{
    QString strFile = QFileDialog::getSaveFileName(this, "save", "/1", "*.png;;*.jpg;;*.bmp");  //保存文件对话框
    //截取制定位置的图片
    QScreen *pScreen = QGuiApplication::primaryScreen();
    QPixmap pixmap = pScreen->grabWindow(0, m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
    pixmap.save(strFile, "png");    //保存图片(格式:png,jpg,bmp)
}

void WidgetTest4::quit()
{
    m_pLabel->hide();   //隐藏坐标
    m_pToolBar->hide(); //隐藏工具栏
    m_bPress = false;   //鼠标弹起
    update();           //更新界面
}

void WidgetTest4::finish()
{
    //截取制定位置的图片
    QScreen* pScreen = QGuiApplication::primaryScreen();
    QPixmap pixmap = pScreen->grabWindow(0, m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
    QClipboard* pClipboard = QApplication::clipboard();   //获取系统剪贴板指针
    pClipboard->setPixmap(pixmap);  //复制到剪切板
    close();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容