• 初识Qt涂鸦板绘制


    1、新建一个Qt Gui应用,项目名称为myPalette,基类选择为QMainWindow,类名设置为MainWindow。

    2、在mainwindow.h头文件中添加以下代码,同时添加#include<QPushButton>

     1 private:
     2     Ui::MainWindow *ui;
     3     QPixmap pix;
     4     QPoint lastPoint;
     5     QPoint endPoint;
     6     qreal scale;
     7     QPushButton *zoomInButton, *zoomOutButton;
     8 
     9 protected:
    10     void paintEvent(QPaintEvent *);
    11     void mousePressEvent(QMouseEvent *);
    12     void mouseMoveEvent(QMouseEvent *);
    13     void mouseReleaseEvent(QMouseEvent *);
    14 
    15 public slots:
    16     void zoomIn();
    17     void zoomOut();

    3、在mainwindow.cpp文件中添加#include<QPainter>,同时在构造函数中添加以下代码段

     1  resize(600, 500);//窗口大小
     2     pix = QPixmap(400, 400);//画布大小
     3     pix.fill(Qt::white);
     4 
     5     scale = 1;//不放大
     6     zoomInButton = new QPushButton(this);//放大按钮
     7     zoomInButton->setText(tr("zoomIn"));
     8     zoomInButton->move(400,450);
     9     zoomOutButton = new QPushButton(this);//缩小按钮
    10     zoomOutButton->setText(tr("zoomOut"));
    11     zoomOutButton->move(500,450);
    12 
    13     connect(zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn()));
    14     connect(zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut()));

    4、在mainwindow.cpp文件中配置相关的事件函数,代码如下

     1 void MainWindow::paintEvent(QPaintEvent *)
     2 {
     3     QPainter pp(&pix);
     4     pp.drawLine(lastPoint/scale, endPoint/scale);//保证画布坐标和窗口坐标相同,避免窗口坐标变化,而画布坐标未发生改变
     5     lastPoint = endPoint;
     6     QPainter painter(this);
     7     painter.scale(scale, scale);//进行放大操作,放大的是窗口坐标。如果想放大画布坐标,则执行pp.scale(scale, scale);
     8     painter.drawPixmap(0, 0, pix);//从窗口的原点(0, 0)添加该QPixmap对象,在窗口中放置画布pix。
     9                                                   //若drawPixmap(0, 0, 100, 100, pix),则指定了添加对象的尺寸大小
    10 }
    11 
    12 void MainWindow::mousePressEvent(QMouseEvent *event)
    13 {
    14     if(event->button() == Qt::LeftButton)//button()函数返回的是按下的键,直接判断是否为某个键。适用于鼠标键一次按下
    15     {
    16         lastPoint = event->pos();
    17     }
    18 }
    19 
    20 void MainWindow::mouseMoveEvent(QMouseEvent *event)
    21 {
    22     if(event->buttons()&Qt::LeftButton)//buttons()函数返回的是按下的键的状态,需要通过OR运算进行判断。适用于鼠标键持续按下
    23     {
    24         endPoint = event->pos();
    25         update();//调用update()函数会进行paintEvent()函数的重新绘制
    26     }
    27 }
    28 
    29 void MainWindow::mouseReleaseEvent(QMouseEvent *event)
    30 {
    31     if(event->button() == Qt::LeftButton)
    32     {
    33         endPoint = event->pos();
    34         update();
    35     }
    36 }
    37 
    38 void MainWindow::zoomIn()
    39 {
    40     scale *= 2;//放大两倍
    41     update();
    42 }
    43 
    44 void MainWindow::zoomOut()
    45 {
    46     scale /= 2;//缩小两倍
    47     update();
    48 }

    5、运行结果如下

  • 相关阅读:
    Swift学习 --- 2.1基础部分
    【oracle案例】ORA-01722
    一种适合于大数据的并行坐标下降法
    【机器学习算法-python实现】svm支持向量机(3)—核函数
    让Editplus支持sql语法高亮显示
    CF986F Oppa Funcan Style Remastered
    HashMap和Hashtable的区别
    ArrayList和Vector的区别
    基本概念
    java编程规范
  • 原文地址:https://www.cnblogs.com/peter-czhang/p/3381977.html
Copyright © 2020-2023  润新知