一、
画图
1、QPainter
Qt中定义了几种绘图设备,如QWidget、QPainter、QPixmap等等。他们都继承自QPaintDevice
QPainter提供了许多高度优化的函数去完成GUI画图工作,可以画简单的或者复杂的图形。QPainter使用QWIdget的painter事件来画图,事件处理函数是paintEvent(QPaintEvent *e)
画图时首先要有一个QPainter实例
QPainter p;
启动画图功能,参数指定画图的父控件
p.begin(this);
开始画图
p.drawRect(QRect r);
关闭画图功能
p.end();
整个绘图过程都是在Qt事件中
QPainter提供一系列的函数可以让我们画出一些基本图形
2、QPen
在画图的时候,QPen用来画轮廓线。因此我们可以使用QPen来改变图形的轮廓,例如可以画实线、虚线、点线等等
改变QPainter的画笔:
QPainter p;
QPen pen;
p.setPen(pen);
改变画笔自身的属性
pen.setColor(Qt::white); //颜色
pen.setStyle(Qt::SolidLine);//样式
3、QBrush
在画图的时候,QBrush可以填充图形,例如可以将图形填充为黄色、绿色等等
改变QPainter的画笔:
QPainter p;
QBrush brush;
p.setBrush(brush);
改变画笔自身的属性
brush.setColor(Qt::white); //颜色
brush.setStyle(Qt::CrossPattern);//样式
update()函数会产生一个画图事件
4、update
update()函数会产生一个画图事件,当串口被隐藏、部件失效的时候,这个函数会产生一个事件
二、坐标系变换
Qt的坐标系由QPainter控制,同时也由QPaintDevice控制。
QPaintDevice是物理坐标,QPainter是逻辑坐标。逻辑坐标和物理坐标默认是一致的,但是也可以变换。Qt坐标原点在左上角,x轴向右增长,y轴上下增长
QPainter提供了一些变换函数,可以实现坐标的变换
1)tanslate(x,y) 平移
2)scale(m,n)缩放
3)shear(x,y)扭曲
4)rotate(m)旋转
三、QImage
Qt提供了4个处理图像的类:QImage、QPixmap、QBitmap、QPicture
QImage可以直接存储像素数据
QPixmap用来在屏幕上显示图片
QPicture可以记录和重放QPainter类
QBitmap用来处理位图,继承自QPixmap
QImage支持的图像可以是单位、8位、32位、alpha混合格式
加载图像可以使用load()函数、loadFromData()函数;save()可以保存图像
size() height() width()可以获取图像的大小等信息
format()可以取出图像的格式
convertToFormat()可以转换图片格式
使用QPainter的drawImage方法可以将QImage图案画到窗口
1、QPainter
Qt中定义了几种绘图设备,如QWidget、QPainter、QPixmap等等。他们都继承自QPaintDevice
QPainter提供了许多高度优化的函数去完成GUI画图工作,可以画简单的或者复杂的图形。QPainter使用QWIdget的painter事件来画图,事件处理函数是paintEvent(QPaintEvent *e)
画图时首先要有一个QPainter实例
QPainter p;
启动画图功能,参数指定画图的父控件
p.begin(this);
开始画图
p.drawRect(QRect r);
关闭画图功能
p.end();
整个绘图过程都是在Qt事件中
QPainter提供一系列的函数可以让我们画出一些基本图形
2、QPen
在画图的时候,QPen用来画轮廓线。因此我们可以使用QPen来改变图形的轮廓,例如可以画实线、虚线、点线等等
改变QPainter的画笔:
QPainter p;
QPen pen;
p.setPen(pen);
改变画笔自身的属性
pen.setColor(Qt::white); //颜色
pen.setStyle(Qt::SolidLine);//样式
3、QBrush
在画图的时候,QBrush可以填充图形,例如可以将图形填充为黄色、绿色等等
改变QPainter的画笔:
QPainter p;
QBrush brush;
p.setBrush(brush);
改变画笔自身的属性
brush.setColor(Qt::white); //颜色
brush.setStyle(Qt::CrossPattern);//样式
update()函数会产生一个画图事件
4、update
update()函数会产生一个画图事件,当串口被隐藏、部件失效的时候,这个函数会产生一个事件
点击(此处)折叠或打开
- #include "MyDraw.h"
-
- MyDraw::MyDraw()
- {
- //控件初始化
- btn = new QPushButton("更改");
- colorBoxInit();
- styleBoxInit();
- drawWidgetInit();
- //水平布局
- QHBoxLayout *hLay = new QHBoxLayout();
- hLay->addWidget(colorBox);
- hLay->addWidget(styleBox);
- hLay->addWidget(btn);
- //垂直布局
- QVBoxLayout *vLay = new QVBoxLayout();
- vLay->addLayout(hLay);
- vLay->addWidget(drawWidget);
- //加载布局
- setLayout(vLay);
- //绑定信号和槽函数
- connect(btn, SIGNAL(clicked()), this, SLOT(changeSlot()));
- //重定义窗口大小
- resize(500,500);
- // drawWidget->setPalette(QPalette(Qt::white));
- }
- void MyDraw::colorBoxInit()
- {
- colorBox = new QComboBox();
- QStringList color;
- color"红""黄""蓝""绿""黑";
- colorBox->addItems(color);
- }
- void MyDraw::styleBoxInit()
- {
- styleBox = new QComboBox();
- QStringList style;
- style"实线""虚线""点划线";
- styleBox->addItems(style);
- }
- void MyDraw::drawWidgetInit()
- {
- drawWidget = new QWidget;
- drawWidget->resize(400, 400);
- }
-
- void MyDraw::changeSlot()
- {
- switch(colorBox->currentIndex())
- {
- case 0:
- pen.setColor(Qt::red);
- break;
- case 1:
- pen.setColor(Qt::yellow);
- break;
- case 2:
- pen.setColor(Qt::blue);
- break;
- case 3:
- pen.setColor(Qt::black);
- break;
- default:
- break;
- }
- switch(styleBox->currentIndex())
- {
- case 0:
- pen.setStyle(Qt::SolidLine);
- break;
- case 1:
- pen.setStyle(Qt::DashLine);
- break;
- case 2:
- pen.setStyle(Qt::DotLine);
- break;
- default:
- break;
- }
- //event
- update();
- }
-
- //绘图时间
- void MyDraw::paintEvent(QPaintEvent *e)
- {
- p.begin(this);
- p.setPen(pen);
- QBrush brush;
- brush.setStyle(Qt::CrossPattern);
- p.setBrush(brush);
- QRect rect(100, 100, 200, 400);
- p.drawEllipse(rect);
- p.end();
- }
二、坐标系变换
Qt的坐标系由QPainter控制,同时也由QPaintDevice控制。
QPaintDevice是物理坐标,QPainter是逻辑坐标。逻辑坐标和物理坐标默认是一致的,但是也可以变换。Qt坐标原点在左上角,x轴向右增长,y轴上下增长
QPainter提供了一些变换函数,可以实现坐标的变换
1)tanslate(x,y) 平移
2)scale(m,n)缩放
3)shear(x,y)扭曲
4)rotate(m)旋转
点击(此处)折叠或打开
- #include "MyDraw.h"
-
- MyDraw::MyDraw()
- {
- //控件初始化
- btn = new QPushButton("更改");
- colorBoxInit();
- styleBoxInit();
- drawWidgetInit();
- //水平布局
- QHBoxLayout *hLay = new QHBoxLayout();
- hLay->addWidget(colorBox);
- hLay->addWidget(styleBox);
- hLay->addWidget(btn);
- //垂直布局
- QVBoxLayout *vLay = new QVBoxLayout();
- vLay->addLayout(hLay);
- vLay->addWidget(drawWidget);
- //加载布局
- setLayout(vLay);
- //绑定信号和槽函数
- connect(btn, SIGNAL(clicked()), this, SLOT(changeSlot()));
- //重定义窗口大小
- resize(500,500);
- drawWidget->setPalette(QPalette(Qt::white));
- }
- void MyDraw::colorBoxInit()
- {
- colorBox = new QComboBox();
- QStringList color;
- color"红""黄""蓝""绿""黑";
- colorBox->addItems(color);
- }
- void MyDraw::styleBoxInit()
- {
- styleBox = new QComboBox();
- QStringList style;
- style"实线""虚线""点划线";
- styleBox->addItems(style);
- }
- void MyDraw::drawWidgetInit()
- {
- drawWidget = new QWidget;
- drawWidget->resize(400, 400);
- }
-
- void MyDraw::changeSlot()
- {
- switch(colorBox->currentIndex())
- {
- case 0:
- pen.setColor(Qt::red);
- break;
- case 1:
- pen.setColor(Qt::yellow);
- break;
- case 2:
- pen.setColor(Qt::blue);
- break;
- case 3:
- pen.setColor(Qt::black);
- break;
- default:
- break;
- }
- switch(styleBox->currentIndex())
- {
- case 0:
- pen.setStyle(Qt::SolidLine);
- break;
- case 1:
- pen.setStyle(Qt::DashLine);
- break;
- case 2:
- pen.setStyle(Qt::DotLine);
- break;
- default:
- break;
- }
- update();
- }
-
- //绘图时间
- void MyDraw::paintEvent(QPaintEvent *e)
- {
- //构造一个矩形
- QRect rect(100,100,300,400);
- //开始画图
- p.begin(this);
- //指定一个画刷
- QBrush brush;
- brush.setStyle(Qt::CrossPattern);
- //加载画笔和画刷
- p.setPen(pen);
- p.setBrush(brush);
- //画椭圆
- p.drawEllipse(rect);
-
- p.translate(100, 0);
- p.drawEllipse(rect);
- p.scale(0.5, 0.5);
- p.drawEllipse(rect);
-
- p.end();
- }
三、QImage
Qt提供了4个处理图像的类:QImage、QPixmap、QBitmap、QPicture
QImage可以直接存储像素数据
QPixmap用来在屏幕上显示图片
QPicture可以记录和重放QPainter类
QBitmap用来处理位图,继承自QPixmap
QImage支持的图像可以是单位、8位、32位、alpha混合格式
加载图像可以使用load()函数、loadFromData()函数;save()可以保存图像
size() height() width()可以获取图像的大小等信息
format()可以取出图像的格式
convertToFormat()可以转换图片格式
使用QPainter的drawImage方法可以将QImage图案画到窗口
点击(此处)折叠或打开
- #include "myImage.h"
-
- myImage::myImage()
- {
- //控件初始化
- openBtn = new QPushButton("打开");
- saveBtn = new QPushButton("保存");
- image.load("/cut.jpg");
- QHBoxLayout *hLay = new QHBoxLayout();
- hLay->addWidget(openBtn);
- hLay->addWidget(saveBtn);
- //布局
- QVBoxLayout *vLay = new QVBoxLayout();
- vLay->addLayout(hLay);
- QWidget *widget = new QWidget();
- widget->resize(500,500);
- vLay->addWidget(widget);
- //加载布局
- setLayout(vLay);
- resize(600,600);
- //绑定信号
- connect(openBtn, SIGNAL(clicked()), this, SLOT(openSlot()));
- connect(saveBtn, SIGNAL(clicked()), this, SLOT(saveSlot()));
- }
- //槽函数
- void myImage::openSlot()
- {
- //获取文件名字
- QString str = QFileDialog::getOpenFileName(this, "打开文件", "/", "All File(*.*)");
- //加载图片
- image.load(str);
- update();
- }
- //槽函数
- void myImage::saveSlot()
- {
- bool ok;
- //获取输入的信息
- QString str = QInputDialog::getText(this, "输入对话框", "请输入名字", QLineEdit::Normal, "wj", &ok);
-
- //保存图像
- image.save(str + ".png");
- }
- void myImage::paintEvent(QPaintEvent *e)
- {
- QPainter p(this);
- p.drawImage(100,100,image);
- }