一、画图
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);
-
}
阅读(3285) | 评论(0) | 转发(0) |