QT实现截图工具

QT实现截图功能

最近突发奇想,想实现一个截图软件,于是使用QT写了一个基本的截图软件功能,后续会在优化,接下来我先介绍一下自己的实现思路

主体部分

主体部分就是实现一个遮罩和截图框,加上一个横向的菜单。

遮罩和截图框使用两个pixmap实现。实现一个Screen类,用来控制截图框的大小

#include <QObject>
#include <QSize>
#include <QPoint>

class TurboScreen : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QPoint pos_left_up_ READ getPosLeftUp WRITE setPosLeftUp USER true);
    Q_PROPERTY(QPoint pos_right_down_ READ getPosLeftUp WRITE setPosLeftUp USER true);
    Q_PROPERTY(QPoint mouse_start_pos_ READ getMouseStartPos WRITE setMouseStartPos USER true);
    Q_PROPERTY(QPoint mouse_end_pos_ READ getMouseEndPos WRITE setMouseEndPos USER true);
    Q_PROPERTY(int max_width_ READ getMaxWidth WRITE setMaxWidth USER true);
    Q_PROPERTY(int max_height_ READ getMaxHeight WRITE setMaxHeight USER true);
public:
    enum STATUS
    {
        emSELECT,
        emMOV,
        emDRAW
    };
    explicit TurboScreen(QObject *parent = 0);
    explicit TurboScreen(const QSize &size, QObject *parent = 0);
    ~TurboScreen() override;

    void setPosLeftUp(const QPoint &point);
    QPoint getPosLeftUp();

    void setPosRightDown(const QPoint &point);
    QPoint getPosRightDown();

    void setMouseStartPos(const QPoint &point);
    QPoint getMouseStartPos();

    void setMouseEndPos(const QPoint &point);
    QPoint getMouseEndPos();

    void setMaxWidth(const int &value);
    int getMaxWidth();

    void setMaxHeight(const int &value);
    int getMaxHeight();

    void setStatus(const STATUS &status);
    STATUS getStatus();

    bool checkIsInArea(const QPoint &pos);
    void move(const QPoint &p);

protected:
    void comparePoints(QPoint &leftTop, QPoint &rightDown);

private:
    QPoint            pos_left_up_;
    QPoint            pos_right_down_;
    QPoint            mouse_start_pos_;
    QPoint            mouse_end_pos_;
    int               max_width_{0};
    int               max_height_{0};
    STATUS            status_;
};

截图主体类的设计

class TurboScreenCut : public QWidget
{
    Q_OBJECT
public:
    explicit TurboScreenCut(QWidget *parent = nullptr);
    static TurboScreenCut & instance();
    ~TurboScreenCut() override;

    void saveCutScreen();
    void drawPaintbrush();
    void drawEllipse();
    void drawRect();
    void drawMosaic();
    void drawArrow();
    void setCurrentCode(TurboShape::Code code);

protected:
    void showEvent(QShowEvent *event) override;
    void paintEvent(QPaintEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

    void keyPressEvent(QKeyEvent *event) override;

    bool event(QEvent *event) override;

private:
    TurboScreen                   *screen_{nullptr};
    QPixmap                       *blur_pix_{nullptr};        //模糊背景图
    QPixmap                       *full_pix_{nullptr};        //全屏图像
    QPixmap                       mosaic_pix_;
    QPoint                        mov_pos_;          //坐标
    QPoint                        rect_left_pos_;    //坐标
    TurboMenu                     *menu_;
    QList<TurboShape*>            shape_list_;
    TurboShape                    *shape_{nullptr};
    TurboShape::Code              current_code_;
};

横向菜单的设计

横向菜单是使用QWidget加按钮做成的

Menu主体代码:

void TurboMenu::initUi()
{
    QFrame *frame = new QFrame(this);
    QHBoxLayout *layout1 = new QHBoxLayout(this);
    QHBoxLayout *layout2 = new QHBoxLayout(this);
    frame->setLayout(layout1);
    setLayout(layout2);
    QPushButton *btnRect = new QPushButton(this);
    btnRect->setIcon(QIcon(":resources/image/rectangle.png"));
    btnRect->setIconSize(QSize(16, 16));
    connect(btnRect, &QPushButton::clicked, this, &TurboMenu::btnRectClicked);
    QPushButton *btnEllipse = new QPushButton(this);
    btnEllipse->setIcon(QIcon(":resources/image/ellipse.png"));
    btnEllipse->setIconSize(QSize(16, 16));
    connect(btnEllipse, &QPushButton::clicked, this, &TurboMenu::btnEllipseClicked);
    QPushButton *btnArrow = new QPushButton(this);
    btnArrow->setIcon(QIcon(":resources/image/arrow.png"));
    btnArrow->setIconSize(QSize(16, 16));
    connect(btnArrow, &QPushButton::clicked, this, &TurboMenu::btnArrowClicked);
    QPushButton *btnPaintbrush = new QPushButton(this);
    btnPaintbrush->setIcon(QIcon(":resources/image/paintbrush.png"));
    btnPaintbrush->setIconSize(QSize(16, 16));
    connect(btnPaintbrush, &QPushButton::clicked, this, &TurboMenu::btnPaintbrushClicked);
    QPushButton *btnMosaic = new QPushButton(this);
    btnMosaic->setIcon(QIcon(":resources/image/mosaic.png"));
    btnMosaic->setIconSize(QSize(16, 16));
    connect(btnMosaic, &QPushButton::clicked, this, &TurboMenu::btnMosaicClicked);
    QPushButton *btnSave = new QPushButton(this);
    btnSave->setIcon(QIcon(":resources/image/save.png"));
    btnSave->setIconSize(QSize(16, 16));
    connect(btnSave, &QPushButton::clicked, this, &TurboMenu::btnSaveClicked);
    QPushButton *btnQuit = new QPushButton(this);
    btnQuit->setIcon(QIcon(":resources/image/close.png"));
    btnQuit->setIconSize(QSize(16, 16));
    connect(btnQuit, &QPushButton::clicked, this, &TurboMenu::btnQuitClicked);
    layout1->addWidget(btnRect);
    layout1->addWidget(btnEllipse);
    layout1->addWidget(btnArrow);
    layout1->addWidget(btnPaintbrush);
    layout1->addWidget(btnMosaic);
    layout1->addWidget(btnSave);
    layout1->addWidget(btnQuit);
    layout2->addWidget(frame);
    QFile file(":resources/style/menu.qss");
    file.open(QIODevice::ReadOnly);
    QByteArray array = file.readAll();
    file.close();
    setStyleSheet(array);
}

绘制类

基类设计

class TurboShape
{
public:
    enum Code
    {
        emLine,
        emRect,
        emEllipse,
        emArrow,
        emMosaic
    };
    TurboShape();
    ~TurboShape();

    void setPosLeftUp(const QPoint &point);
    QPoint getPosLeftUp();

    void setPosRightDown(const QPoint &point);
    QPoint getPosRightDown();

    void setMovePoint(const QPoint &point);

    virtual void pushLinePoint(const QPoint &point){};

    void setMoveStatus(const bool &status);
    QVector<QPoint> getArrowShape();

    virtual void setMosaic(const QPixmap &map){};
    virtual QPixmap getMosaic(){ return QPixmap(); };

    virtual void paint(QPainter & painter) = 0;

protected:
    QPoint left_up_pos_;
    QPoint right_down_pos_;
    QPoint move_point_;
    bool move_status_;
};

各种形状的设计

class Line : public TurboShape
{
public:
    Line();
    void paint(QPainter &painter) override;

    void pushLinePoint(const QPoint &point);

private:
    QVector<QPoint> line_points_;
};

class Rect : public TurboShape
{
public:
    Rect();
    void paint(QPainter &painter);
};

class Ellipse : public TurboShape
{
public:
    Ellipse();
    void paint(QPainter &painter);
};

class Arrow : public TurboShape
{
public:
    Arrow();
    void paint(QPainter &painter);
    void pushLinePoint(const QPoint &point);

private:
    QVector<QPoint> line_points_;
};

class Mosaic : public TurboShape
{
public:
    Mosaic();
    void paint(QPainter &painter);

    void pushLinePoint(const QPoint &point) override;
    void setMosaic(const QPixmap &map) override;
    QPixmap getMosaic() override;

private:
    QPixmap mosaic_map_;
    QVector<QPoint> line_points_;
};

最终效果展示

在这里插入图片描述

具体实现代码暂不展示,有需要的话请三连加私信。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbolove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值