代码下载链接:  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_简易画板_详细注释的更多相关文章

  1. "飞机大战"游戏_Java实现_详细注释

    1 package cn.xiaocangtian.Util; import java.awt.Frame; import java.awt.Graphics; import java.awt.Ima ...

  2. Java_太阳系_行星模型_小游戏练习_详细注释

    //实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...

  3. Huffman树实现_详细注释

    //最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...

  4. QT_SVG格式图片浏览器_源代码下载_详细注释

    源代码链接: http://pan.baidu.com/s/1pKA5Vcv 密码: ib2x 注:SVG格式图片特点: 1. 文件小 2. 图像中文字独立于图像, 可以编辑,可搜索. 3.没有字体限 ...

  5. Python 实现列表与二叉树相互转换并打印二叉树封装类-详细注释+完美对齐

    # Python 实现列表与二叉树相互转换并打印二叉树封装类-详细注释+完美对齐 from binarytree import build import random # https://www.cn ...

  6. Oracle_Database_11g_标准版_企业版__下载地址_详细列表

    Oracle_Database_11g_标准版_企业版__下载地址_详细列表 Oracle Database 11g Release 2 Standard Edition and Enterprise ...

  7. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  8. 一套强大的vim配置文件+详细注释

    phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...

  9. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

随机推荐

  1. 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18) eoe上看到的

    ===============eoeAndroid社区推荐:======================= 1.Android开发新浪面试题[开发者必看哦]下载地址 http://www.eoeand ...

  2. Android工程文件下assets文件夹与res文件夹的区别

    1.assets:不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会打入程序安装包中, 2 ...

  3. BZOJ1588——[HNOI2002]营业额统计

    1.题目大意:一个简单的treap模板题(我才不告诉你题目少一句话呢,看discuss去 2.分析:treap模板题 #include <cstdio> #include <cstd ...

  4. leetcode 74. Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  5. Android学习笔记(十六)——数据库操作(上)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, ...

  6. am335x sd卡启动开启识别emmc kernel 上的改动

    sbc 7109-454 sd 卡启动qt系统后一直识别不了  emmc 也就是mmc1口, 一开始以为是硬件初始化的问题,后面又以为是io口复用,最后才知道是根本没有注册mmc1设备. 更改下面的代 ...

  7. echart字符云之添加点击事件

    // 路径配置 require.config({ paths : { echarts : 'jquery/echarts-2.2.7/build/dist' } }); // 使用EChart.js画 ...

  8. echarts

    ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/11 ...

  9. linux下的/dev/shm目录

    linux下的/dev/shm目录 linux中/dev目录下一般都是一些设备文件,例如磁盘.内存.摄像头等. /dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都 ...

  10. HDU 1495 非常可乐

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103711#problem/M /*BFS简单题 链接地址: http://acm.hdu ...