Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg
显示效果如下:
代码附有详细注释(代码如下)
/***
* 先新建QMainWindow, 项目名称: DrawWidget 基类选择: QMainWindow,
* 类名默认, 然后在DrawWidget项目名上新建c++class文件, 选择基类: QWidget
*/
//先完成绘图区的实现
//如下为: drawwidget.h
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H #include <QWidget>
#include <QtGui>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QColor>
#include <QPixmap>
#include <QPoint>
#include <QPainter>
#include <QPalette> class DrawWidget : public QWidget
{
Q_OBJECT
public:
explicit DrawWidget(QWidget *parent = );
//鼠标事件重定义
void mousePressEvent (QMouseEvent *);
void mouseMoveEvent (QMouseEvent *);
//重画事件重定义
void paintEvent (QPaintEvent *);
//尺寸变化事件重定义
void resizeEvent (QResizeEvent *);
signals:
public slots:
void setStyle (int);
void setWidth (int);
void setColor (QColor);
void clear ();
private:
QPixmap *pix;
QPoint startPos; //点类
QPoint endPos;
int style;
int weight;
QColor color;
}; #endif // DRAWWIDGET_H
//drawwidget.cpp
//DrawWidget构造函数完成对窗体参数及部分功能的初始化工作
#include "drawwidget.h"
#include <QtGui>
#include <QPen> DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
setAutoFillBackground (true); //对窗体背景色的设置
setPalette (QPalette(Qt::white)); //背景色为白
pix = new QPixmap(size()); //此QPixmap对象用来准备随时接受绘制的内容
pix->fill (Qt::white); //填充背景色为白色
setMinimumSize (, ); //设置绘制区窗体的最小尺寸
} //接受主窗体传来的线型风格参数
void DrawWidget::setStyle (int s)
{
style = s;
} //setWidth()接受主窗体传来的线宽参数值
void DrawWidget::setWidth (int w)
{
weight = w;
} //接受主窗体传来的画笔颜色值
void DrawWidget::setColor (QColor c)
{
color = c;
} //重定义鼠标按下事件--按下鼠标时,记录当前鼠标位置值startPos
void DrawWidget::mousePressEvent (QMouseEvent *e)
{
startPos = e->pos ();
} //重定义鼠标移动事件--默认情况下,在鼠标按下的同时拖曳鼠标时被触发.
//mouseTracking事件,可以通过设置setMouseTracking(bool enable)为true,
//则无论是否有鼠标键按下,只要鼠标移动,就会触发mouseMoveEvent()
//在此函数中,完成向QPixmap对象中绘图的工作.
void DrawWidget::mouseMoveEvent (QMouseEvent *e)
{
QPainter *painter = new QPainter; //新建一个QPainter对象
QPen pen; //新建一个QPen对象
//设置画笔的线型,style表示当前选择的线型是Qt::PenStyle枚举数据中的第几个元素
pen.setStyle ((Qt::PenStyle)style);
pen.setWidth (weight); //设置画笔的线宽值
pen.setColor (color); //设置画笔的颜色
/***
* 以QPixmap对象为QPaintDevice参数绘制,构造一个QPainter对象,
* 就立即开始对绘画设备进行绘制,此构造QPainter对象是短期的
* 由于当一个QPainter对象的初始化失败时构造函数不能提供反馈信息,
* 所以在绘制 外部设备时 应使用begin()和end()(Ps:如打印机外部设备)
*/
painter->begin (pix);
painter->setPen (pen); //将QPen对象应用到绘制对象当中
//绘制从startPos到鼠标当前位置的直线
painter->drawLine (startPos, e->pos ());
painter->end (); //绘制成功返回true
startPos = e->pos (); //更新鼠标的当前位置,为下次绘制做准备
update (); //重绘绘制区窗体
} /***
* 重画函数paintEvent()完成绘制区窗体的更新工作,只需要调用drawPixmap()函数将用于接收图形绘制的
* 的QPixmap对象绘制在绘制区窗体控件上即可.
*/
void DrawWidget::paintEvent (QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap (QPoint(,), *pix);
} /***
* 调整绘制区大小函数resizeEvent():
* 当窗体大小改变是,实际能够绘制的区域仍然没有改变,因为绘图的大小没有改变
* 所以窗体尺寸变化时,应及时调整用于绘制的QPixmap对象的尺寸大小
*/
void DrawWidget::resizeEvent (QResizeEvent *event)
{
//判断改变后的窗体长或宽是否大于原窗体的长和宽;
//若大于则进行相应调整;
if (height () > pix->height () || width () > pix->width ())
{
QPixmap *newPix = new QPixmap(size()); //创建一个新的QPixmap对象
newPix->fill (Qt::white); //填充新QPixmap对象newPix的颜色为白色背景色
QPainter p(newPix);
p.drawPixmap (QPoint(, ), *pix); //在newPix中绘制原pix中内容
pix = newPix; //将newPix赋值给Pix作为新的绘制图形接收对象
}
//否则直接调用QWidget的resizeEvent()函数返回
QWidget::resizeEvent (event); //完成其余工作 } /***
* clear()函数完成绘制区的清除工作,只需要一个新的,干净的QPixmap对象代替pix,并调用update()重绘即可
*/
void DrawWidget::clear ()
{
QPixmap *clearPix = new QPixmap(size());
clearPix->fill (Qt::white);
pix = clearPix;
update ();
}
//以上为能够响应鼠标事件进行绘图功能的窗体类实现
//主窗口的实现
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QToolButton>
#include <QLabel>
#include <QComboBox> //下拉列表框
#include <QSpinBox> //自选盒
#include "drawwidget.h" class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = );
~MainWindow();
void createToolBar(); //创建工具栏
public slots:
void ShowStyle(); //进行选择线型风格的槽函数
void ShowColor(); //选择颜色的槽函数
private:
DrawWidget *drawWidget; //创建能够响应鼠标事件进行绘图功能的窗体类
QLabel *styleLabel; //风格
QComboBox *styleComboBox;
QLabel *widthLabel; //线宽
QSpinBox *widthSpinBox; //线宽自旋框
QToolButton *colorBtn; //颜色工具
QToolButton *clearBtn; //清除按钮
}; #endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include <QToolBar>
#include <QColorDialog> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
drawWidget = new DrawWidget; //新建一个DrawWidget对象--能够响应鼠标事件进行绘图功能的窗体类
setCentralWidget (drawWidget); //新建的DrawWidget对象作为主窗口的中央窗体
createToolBar (); //实现一个工具栏
setMinimumSize (, ); //设置主窗口的最小尺寸
ShowStyle (); //初始化线型,设置控件中的当前值作为初始值
drawWidget->setWidth (widthSpinBox->value ()); //初始化线宽
drawWidget->setColor (Qt::black); //初始化颜色
} //工具栏创建
void MainWindow::createToolBar ()
{
QToolBar *toolBar = addToolBar ("Tool"); //为主窗口新建一个工具栏对象
styleLabel = new QLabel(tr("线型风格: ")); //创建线性选择控件
styleComboBox = new QComboBox;
styleComboBox->addItem (tr("SolidLine"),
static_cast<int>(Qt::SolidLine));
styleComboBox->addItem (tr("DashLine"),
static_cast<int>(Qt::DashLine));
styleComboBox->addItem (tr("DotLine"),
static_cast<int>(Qt::DotLine));
styleComboBox->addItem (tr("DashDotLine"),
static_cast<int>(Qt::DashDotLine));
styleComboBox->addItem (tr("DashDotDotLine"),
static_cast<int>(Qt::DashDotDotLine));
connect (styleComboBox, SIGNAL(activated(int)), this, SLOT(ShowStyle())); //关联相应的槽函数
widthLabel = new QLabel(tr("线宽: ")); //创建线宽选择控件
widthSpinBox = new QSpinBox;
connect (widthSpinBox, SIGNAL(valueChanged(int)), drawWidget, SLOT(setWidth(int))); colorBtn = new QToolButton; //创建颜色选择控件
QPixmap pixmap(, ); //颜色选择按钮控件上的图像
pixmap.fill (Qt::black); //填充黑色
colorBtn->setIcon (QIcon(pixmap)); //设置按钮图像
connect (colorBtn, SIGNAL(clicked(bool)), this, SLOT(ShowColor())); clearBtn = new QToolButton(); //创建清除按钮
clearBtn->setText (tr("清除"));
connect (clearBtn, SIGNAL(clicked(bool)), drawWidget, SLOT(clear())); toolBar->addWidget (styleLabel);
toolBar->addWidget (styleComboBox);
toolBar->addWidget (widthLabel);
toolBar->addWidget (widthSpinBox);
toolBar->addWidget (colorBtn);
toolBar->addWidget (clearBtn);
} //ShowStyle(),通过调用DrawWidget类的setStyle()函数将当前线型选择控件中的线型参数传给绘制区;
void MainWindow::ShowStyle ()
{
drawWidget->setStyle (styleComboBox->itemData (styleComboBox->currentIndex (),
Qt::UserRole).toInt ());
} //ShowColor(),通过DrawWidget类的setColor()函数将用户在标准颜色对话框中选择的颜色值传给绘制区
void MainWindow::ShowColor ()
{
QColor color = QColorDialog::getColor (static_cast<int>(Qt::black)); //默认为黑(static_cast<int>转换成int节省内存
//使用标准颜色对话框QColorDialog获得一个颜色值
if (color.isValid ())
{
//先将新选择的颜色传给绘制区,用于改变画笔的颜色值
drawWidget->setColor (color);
//改变按钮图案
QPixmap p(, ); //设置图像大小
p.fill (color); //填充颜色
colorBtn->setIcon (QIcon(p)); //设置颜色按钮图案
}
} MainWindow::~MainWindow()
{
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QFont> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont font("ZYSong18030", );
a.setFont (font); MainWindow w;
w.show(); return a.exec();
}
Qt5_简易画板_详细注释的更多相关文章
- "飞机大战"游戏_Java实现_详细注释
1 package cn.xiaocangtian.Util; import java.awt.Frame; import java.awt.Graphics; import java.awt.Ima ...
- Java_太阳系_行星模型_小游戏练习_详细注释
//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...
- Huffman树实现_详细注释
//最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...
- QT_SVG格式图片浏览器_源代码下载_详细注释
源代码链接: http://pan.baidu.com/s/1pKA5Vcv 密码: ib2x 注:SVG格式图片特点: 1. 文件小 2. 图像中文字独立于图像, 可以编辑,可搜索. 3.没有字体限 ...
- Python 实现列表与二叉树相互转换并打印二叉树封装类-详细注释+完美对齐
# Python 实现列表与二叉树相互转换并打印二叉树封装类-详细注释+完美对齐 from binarytree import build import random # https://www.cn ...
- Oracle_Database_11g_标准版_企业版__下载地址_详细列表
Oracle_Database_11g_标准版_企业版__下载地址_详细列表 Oracle Database 11g Release 2 Standard Edition and Enterprise ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- 一套强大的vim配置文件+详细注释
phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...
- Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...
随机推荐
- 我们为之奋斗过的C#之---简单的库存管理系统
今天非常开心,因为今天终于要给大家分享一个库存管理项目了. 我个人感觉在做项目之前一定先要把逻辑思路理清,不要拿到项目就噼里啪啦的一直敲下去这样是一不好的习惯,等你做大项目的时候,你就不会去养成一种做 ...
- C#遍历文件夹及文件
背景: 想自己实现一个网盘系统,于是需要用到遍历文件(夹)操作. C#基本知识梳理: 1.如何获取指定目录包含的文件和子目录 (1). DirectoryInfo.GetFiles():获取目录中(不 ...
- BZOJ3196——二逼平衡树
1.题目大意:给你一个序列,有5种操作,都有什么呢... 1> 区间第k小 这个直接用二分+树套树做 2> 区间小于k的有多少 这个直接用树套树做 3> 单点修改 这个直接用树套树做 ...
- Docker 容器测试全探索
导读 当我们构建好Docker镜像并利用多套容器共同组合成应用程序,建立起持续交付通道,了解了如何将新创建的镜像纳入到生产或者测试环境当中之后,新的问题来了——我们该如何测试自己的Docker容器?测 ...
- python del 注意点
>>> del a[:] >>> a [] del也可以用于删除整个变量: >>> >>> del a 之后再引用名称 a 将会 ...
- eclipse添加velocity项目
1.首先添加jar包,记得包含以下的主要两个类别 2.新建一个servlet类(继承自VelocityViewServlet) package com.servlet; import java.uti ...
- java代码和spring框架读取xml和properties文件
1.java文件读取properties文件 Properties props = new Properties(); try { //资源文件存放在类文件的根目录下.即是放在src下面.则不需要写路 ...
- 微博地址url(id)与mid的相互转换 Java版
原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...
- django的序列化
关于django的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的Json格式 两种方法: 方法一:serializers: 缺点就是只能应用于对象 "&q ...
- (转) C#如何使用异步编程
怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种 ...