zoukankan      html  css  js  c++  java
  • 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();
    }

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

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

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

  • 相关阅读:
    CentOS/Linux安装VNCserver
    vncserver的安装和使用
    linux下常用FTP命令 1. 连接ftp服务器
    linux下安装dovecot
    教你如何架设linux邮件服务器postfix
    vim打开文件时显示行号
    VirtualBox 配置虚拟网卡(桥接),实现主机-虚拟机网络互通
    Linux文件权限详解
    虚拟机下CentOS 6.5配置IP地址的三种方法
    Linux基础知识之man手册的使用
  • 原文地址:https://www.cnblogs.com/shiyixirui/p/15511075.html
Copyright © 2011-2022 走看看