• Qt 实现涂鸦板二:实现放大功能


    在一的基础上改造:

    .h 文件

    #pragma once
    
    #include <QtWidgets/QWidget>
    #include "ui_xuexi.h"
    
    #include "QMouseEvent"
    #include "QKeyEvent"
    #include "QPainter"
    #include "QPushButton"
    
    class xuexi : public QWidget
    {
        Q_OBJECT
    
    public:
        xuexi(QWidget *parent = Q_NULLPTR);
    
        void mousePressEvent(QMouseEvent*e);        // 按下
        void mouseMoveEvent(QMouseEvent*e);         // 移动
        void mouseReleaseRvent(QMouseEvent*e);      // 释放
    
        void paintEvent(QPaintEvent* );
    
    public slots:
        void zoomIn();                              // 放大       
    
    private:
        Ui::xuexiClass ui;
    
        QPixmap pix;
        QPoint lastPoint;
        QPoint endPoint;
    
        int scale;                                  // 放大倍数
        QPushButton* pushbutton;
    };

    .cpp 文件

    #include "xuexi.h"
    
    xuexi::xuexi(QWidget *parent)
        : QWidget(parent)
    {
        ui.setupUi(this);
    
        resize(600, 500);
        pix = QPixmap(200, 200);
        pix.fill(Qt::white);
    
        scale = 1;
        pushbutton = new QPushButton("zoomIn", this);
        pushbutton->move(500, 450);
        connect(pushbutton, SIGNAL(clicked()), this, SLOT(zoomIn()));
    }
    
    void xuexi::mousePressEvent(QMouseEvent*e)
    {
        if (e->button() == Qt::LeftButton)
        {
            lastPoint = e->pos();
        }
    }
    
    void xuexi::mouseMoveEvent(QMouseEvent*e)
    {
        if (e->buttons() == Qt::LeftButton)
        {
            endPoint = e->pos();
            update();
        }
    }
    
    void xuexi::mouseReleaseRvent(QMouseEvent* e)
    {
        if (e->button() == Qt::LeftButton)
        {
            endPoint = e->pos();
            update();
        }
    }
    
    void xuexi::paintEvent(QPaintEvent*)
    {
        // 第一种:效果差点
        /*QPainter pp(&pix);
        pp.drawLine(lastPoint / scale, endPoint / scale);
        lastPoint = endPoint;
    
        QPainter painter(this);
        painter.scale(scale, scale);
        painter.drawPixmap(0, 0, pix);*/
    
        // 第二种:效果更好
        if (scale != 1)
        {
            QPixmap copyPix(pix.size() * scale);
            QPainter pter(&copyPix);
            pter.scale(scale, scale);
            pter.drawPixmap(0, 0, pix);
            pix = copyPix;
            scale = 1;
        }
        QPainter pp(&pix);
        pp.scale(scale, scale);
        pp.drawLine(lastPoint / scale, endPoint / scale);
        lastPoint = endPoint;
    
        QPainter painter(this);
        painter.drawPixmap(0, 0, pix);
    }
    
    
    void xuexi::zoomIn()
    {
        scale *= 2;
        update();
    }

    这里的放大,写了两种实现方法:

    方法一:将涂鸦后的图片放大,这样虽然可以实现,但是放大后,像素个数就表少了,画质就变差了,效果不是很好。

    方法二:是将画布放大,这样像素个数不会变少,画质就高些,效果更好

  • 相关阅读:
    ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)(转载)
    Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016
    kali linux 2016.1 滚动更新源
    使用you-get下载视频网站视频或其他
    asp.net core开发环境准备
    Python黑客编程基础3网络数据监听和过滤
    debian(kali Linux) 安装net Core
    嗅探、中间人sql注入、反编译--例说桌面软件安全性问题
    Python黑客编程2 入门demo--zip暴力破解
    kali linux Python开发环境初始化
  • 原文地址:https://www.cnblogs.com/shiyixirui/p/15511075.html
Copyright © 2020-2023  润新知