Qt实现画笔功能

用Qt实现在窗口上画线,类似于画笔功能。

头文件

#ifndef MyPaint_h__
#define MyPaint_h__

#include <QtWidgets/QWidget>

class MyPaint :public QWidget
{
    Q_OBJECT
public:
    MyPaint(QWidget *parent = nullptr);

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    std::vector<std::vector<QPoint>> _lines;

};

#endif // MyPaint_h__

实现

#include "MyPaint.h"
#include <QPainter>
#include <QMouseEvent>

MyPaint::MyPaint(QWidget *parent):QWidget(parent)
{

}

void MyPaint::mousePressEvent(QMouseEvent *event) //鼠标按下的时候新增加一条线,并记录起点
{
    std::vector<QPoint> line;  
    line.push_back(event->pos());
    _lines.push_back(line);
}

void MyPaint::mouseMoveEvent(QMouseEvent *event)//鼠标移动的时候新增加点
{
    auto &line = _lines[_lines.size() - 1];
    line.push_back(event->pos());

    update(); //更新,重新绘制窗口,自动调用paintEvent
}

void MyPaint::mouseReleaseEvent(QMouseEvent *event)
{
    auto &line = _lines[_lines.size() - 1];
    line.push_back(event->pos());
}

void MyPaint::paintEvent(QPaintEvent *event) //绘制所有的线
{
    //QPainter painter(this);
    //painter.setPen(QPen(Qt::red, 3, Qt::DashLine));
    //painter.setBrush(Qt::blue);
    //painter.drawRect(QRect(10, 10, 100, 30));
    //painter.drawEllipse(130, 10, 50, 50);
    //painter.drawLine(QLine(200, 10, 300, 20));
    //painter.drawText(QPoint(10, 70), "hello" );
    QPainter painter(this);
    painter.setPen(QPen(Qt::green, 3));
    for (const auto &line : _lines)
    {
        for (int i=0;i<line.size()-1;i++)
        {
            painter.drawLine(line.at(i), line.at(i + 1));
        }
    }
}

效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt 实现画线笔锋效果详细原理及示例代码

    前言 之前写过一篇文章介绍Qt中绘制平滑曲线的两种方式,文章在这里.这篇文章详细介绍了绘制的原理和实现方式,那么,如果要在此曲线上实现笔锋效果怎么做呢? 所谓的笔锋效果,就是钢笔书写抬笔时的笔尖,也就是说,绘制曲线抬笔时形成一个笔尖的效果. 话不多说,直接来看效果: 动画效果如下: 实现原理 要实现该效果,需要完成以下几个关键步骤: 1.每两个点形成一个贝塞尔曲线path进行绘制 2.最新的一条path绘制细线(笔锋最细处的宽度) 3.倒数第二条path绘制粗线(正常的线条宽度) 4.在两条pa

  • Qt学习教程之对话框消失动画效果

    一.效果展示 最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时候,我特意浏览了下之前写的两篇文章(QPainterPath 不规则提示框,QPainterPath 不规则提示框(二)),现在回想起来那会儿确实知之甚少,关于顶层窗口不能做圆角,其实帮助文档里已经说的很明确,解决办法有多种,一种是重写paintEvent函数,另一种是把widget包装一层,本篇文

  • Qt 实现钢笔画线效果示例及详细原理

    前言 上一篇文章:Qt 实现画线笔锋效果详细原理,根据这篇介绍的实现笔锋效果的原理,我们很容易实现另外一种笔效:钢笔. 所谓的钢笔笔效,就是真实还原钢笔书写出来的线条效果,其特征就是:根据笔的绘制速度而线条的宽度会逐渐变化,写得越快,线条越细,并且在收笔时带有笔锋效果. 那么,在上一篇文章的基础上,稍微修改一下,就可以实现这个效果,看下效果图: 实现原理 从上一篇文章我们知道,绘制的曲线是通过每两个点形成一条贝塞尔曲线,所以在不松手的情况下连续画线,整条线段是包含很多条path组合而成的.而要实

  • Qt5.9画五角星的方法

    本文实例为大家分享了Qt5.9画五角星的具体代码,供大家参考,具体内容如下 今天记录一下画图部分的程序,比较简单,容易操作,为接下来打好基础: 先说界面吧: 里面的图位置跟图像学有点关系,多多理解一下: 对应的头文件: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT protected: voi

  • Qt实现画笔功能

    用Qt实现在窗口上画线,类似于画笔功能. 头文件 #ifndef MyPaint_h__ #define MyPaint_h__ #include <QtWidgets/QWidget> class MyPaint :public QWidget {     Q_OBJECT public:     MyPaint(QWidget *parent = nullptr);     void mousePressEvent(QMouseEvent *event);     void mouseMo

  • Android画板开发之基本画笔功能

    一.简介 这是画板系列的第一篇,一步步开始,从简单的画板,到功能稍微齐全一点的画板,例如基本画笔.橡皮擦.背景.文字.撤销.反撤销.保存等 这篇带大家实现一个最简单的画板,前提是需要对自定义View有一定的了解. 用的是kotlin语言 二.实现 分析如何实现: 定义了画笔和Path,然后在触摸屏幕的时候,手指一边移动一边进行path的滑动,绘制.这就完成了一个最简单的画笔功能. 下面几十行代码完成这个 class TPView(context: Context,attr:AttributeSe

  • Opencv实现画笔功能

    本文实例为大家分享了Opencv实现画笔功能的具体代码,供大家参考,具体内容如下 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Rect g_rectangle; bool g_bDrawing = false; RNG g_rng(12345); Point g_nCurrPoint; int g_nThick = 0, g_nBlue = 255,

  • Qt实现对齐线功能的示例代码

    目录 现有功能 运行结果 源码 button.h button.cpp window.h window.cpp main.cpp 现有功能 1.添加任意数量的按钮. 2.移动按钮,通过对齐线来设置按钮位置. 3.自动吸附. 运行结果 源码 button.h #ifndef BUTTON_H #define BUTTON_H #include <QPushButton> #include <QWidget> #include <QMouseEvent> class But

  • QT设计秒表功能(跑步计时器)

    本文实例为大家分享了QT设计秒表功能的具体代码,供大家参考,具体内容如下 设计目标 1. 定时器开始 2.复位从0开始计时 3.记录--把记录的时间添加到QTextBrowser, append(时间) 4. QTime t(0,0,0)   t = t.addMsec( number )  t.toString (“hh:mm:ss:zzz”) 定时器(QTimer)的使用 定时器---定时发送信号timeoutQTimer 定时器类 1.创建定时器类对象QTimer mtimer; 2.把定

  • 用QT实现计时器功能

    本文实例为大家分享了QT实现计时器功能的具体代码,供大家参考,具体内容如下 首先新建工程,Ctrl+N->Application(Qt)->Qt Widgets Application,然后进入设置界面,名称和路径随意就好:Build System不考虑性能用qmake比较简单:剩下的采用默认选项就行. 初始化结束后,其项目文件组织如下 Timer.pro 此为工程文件 Headers 用于存放头文件的目录 Sources 用于存放源代码 Forms 用于存放.ui文件,即界面设计文件 双击F

  • 利用QT设计秒表功能

    本文实例为大家分享了QT设计秒表功能的具体代码,供大家参考,具体内容如下 一.窗口界面的设置 可以使用属性栏digitCount来设计此时0的初始位置 二.代码的编写 1.确定时间->每间隔一秒调用一个update函数(进行换算)或者直接调用QT里面的time类:2.确定显示的方式:3.每间隔一段时间调用显示来达到动态效果:4.这里应该查看Qtime/Qlcd的help手册5.在对定时器声明时要注意需要声明成指针,后面的槽函数发出信号者要求是指针类型:6.利用基准时间与当前时间的差值来显示计时器

  • Qt实现计算器功能

    本文实例为大家分享了Qt实现计算器功能的具体代码,供大家参考,具体内容如下 该计算器主要通过lineEdit获取和显示数字,通过tableview显示计算过程. 通过tableview显示计算的过程,QLineEdit获取输入的数字,QComboBox实现不同的计算类型. 效果: 代码: main.cpp #pragma execution_character_set("utf-8") #include "mainwindow.h" #include <QAp

  • Qt实现小功能之复杂抽屉效果详解

    目录 功能讲解 自定义标题widget 标题名称控件的创建 QCheckBox控件的创建 自定义内容Widget 创建显示高度描述控件 QScrollArea中widget实现 QScrollArea子窗口的提升 在Qt自带的控件中,也存在抽屉控件:QToolBar.但是,该控件有个缺点:一次只能展开一个抽屉信息,无法实现多个展开.为此,实现了如下效果的程序: 下面对这种实现效果进行讲解~ 功能讲解 开发环境:VS2017 + Qt5.14.2 64位 实现的核心技术: 1:QScrollAre

  • Qt实现小功能之圆形进度条的方法详解

    目录 功能 图形绘制 1.绘制窗口整体背景色值 2.圆形进度条通道绘制 3.圆形进度条绘制 4.文本绘制 数值计算 1.计算步长 2.实时数据计算 在Qt自带的控件中,只有垂直进度条.水平进度条两种. 在平时做页面开发时,有些时候会用到圆形进度条,比如说:下载某个文件的下载进度. 展示效果,如下图所示: 实现这个功能主要由以下几个重点: 1:图形绘制 2:数值计算 也算是一个初级例子,下面我来讲解下如何实现这个简单的小功能吧! 功能 自定义绘制类:QRoundedProgress 继承自QWid

随机推荐