Qt 实现的简单截屏程序

Qt实现的简单截屏程序,拖动鼠标进行截图,按下enter键将截图保存到剪切板。

下面是主要文件代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void paintEvent(QPaintEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;

private:
    Ui::Widget *ui;
    QPixmap m_screen;      // 全屏截图
    QRect m_rect;          // 截图区域
    QPoint m_startPos;     // 鼠标起始位置
    bool m_dragging = false; // 是否正在拖动
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    setAttribute(Qt::WA_TranslucentBackground);
    
    QScreen *screen = QGuiApplication::primaryScreen();
    m_screen = screen->grabWindow(0);
    resize(m_screen.size());
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_startPos = event->pos();
        m_dragging = true;
        m_rect = QRect(m_startPos, QSize(0, 0));
    }
    update();
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if (m_dragging) {
        QPoint endPos = event->pos();
        m_rect = QRect(
            qMin(m_startPos.x(), endPos.x()),
            qMin(m_startPos.y(), endPos.y()),
            qAbs(endPos.x() - m_startPos.x()),
            qAbs(endPos.y() - m_startPos.y())
        );
        update();
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    m_dragging = false;
}

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    
    QPainter painter(this);
    painter.drawPixmap(0, 0, m_screen);
    
    painter.setBrush(QColor(0, 0, 0, 150));
    painter.drawRect(rect());

    if (!m_rect.isNull())
    {
        painter.setBrush(Qt::NoBrush);
        painter.drawPixmap(m_rect, m_screen, m_rect);

        painter.setPen(QPen(Qt::red, 2));
        painter.drawRect(m_rect.adjusted(0, 0, -1, -1));
    }
}

void Widget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Escape)
    {
        close();
    }
    else if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
    {
        if (!m_rect.isNull())
        {
            QPixmap cropped = m_screen.copy(m_rect);
            QApplication::clipboard()->setImage(cropped.toImage());//截图保存到剪切板
            close();
        }
    }
}

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

你可能感兴趣的:(Qt,qt,截图)