1、绘图的事件
QBitmap ----> QPixmap
QBitmap继承于Qpixmap
两者的区别在于QBitmap用于画黑白图-------->优点:资源消耗小
而QPixmap在于画彩色图--------->缺点:资源消耗大
主要的过程:1、要有画家 2、和画图设备
在qt中为我们准备了三个类QPainter、QPaintEngine、QPaintDevice 我们通常只用到第一个和第三个
中间的一个在绘图过程中就已经被实现了------------->具体的详情等以后学通了在深究(一般只有qt设计人员会用到)
现在开始绘图:
1、首先重写绘图事件:
protected:
void paintEvent(QPaintEvent*);
//虚函数
注意事项:如果在窗口绘图,必须在绘图事件中实现
绘图事件内部自动调用,窗口需要重绘的时候(状态改变)----------->可能不理解,先接着往下看
2、画图片
QPainter p;
p.begin(this);
//p.drawPixmap(0,0,width(),height(),QPixmap("../325724.jpg")); //在这里来解释一下自动调用的意思,当我们改变窗口的大小时,
width(),height()都会自动的获取新窗口的大小
p.drawPixmap(rect(),QPixmap("../325724.jpg"));//效果与 p.drawPixmap(0,0,width(),height(),QPixmap("../325724.jpg")); //一样
p.end();
-----------------------------------------------------------------------------------------------------------------------------
QPainter p(this);
p.drawPixmap(rect(),QPixmap("../325724.jpg")); //简化后的版本,效果一样
-------------------------------------------------------------------------------------------------------------------------------
3、画直线
pen.setWidth(5); //设置画笔的宽度
pen.setColor(QColor(114,214,114)); //画笔的颜色
p.setPen(pen); //将画笔给画家
p.drawLine(100,100,50,50); //画家开始画线
--------------------------------------------------------------------------------------------------------------------------------
4、创建画刷
QBrush brush;
brush.setStyle(Qt::Dense1Pattern);
brush.setColor(QColor(0,255,0));
p.setBrush(brush);
p.drawRect(rect()); //画刷的过程与画笔的一样的
----------------------------------------------------------------------------------------------------------------------------------
5 手动刷新界面----人为的重绘
首先在ui中设置一个push按钮,然后在转到槽
void Widget::on_pushButton_clicked()
{
x+=100;
if((x+100)>width())
{
x=0;
}
update();
}
在槽中书写如上的函数-----------------------------------意思是点击一下push,x的值就加100,然后在更新窗口
注意此时paintEvent函数中的写法是这样的
QPainter p(this);
p.drawPixmap(x,0,100,100,QPixmap("../325724.jpg"));------------------它们都通过--x---这个私有的变量联系在一起
---------------------------------------------------------------------------------------------------------------------------------------------------
6 QBitmap与QPixmap的比较
QPainter p(this);
p.drawPixmap(rect(),QBitmap("../325724.jpg")); //黑白的图
p.drawPixmap(rect(),QPixmap("../325724.jpg")); //彩色的图
-----------------------------------------------------------------------------------------------------------------------------------
7 现在再来看看画图设备
QPixmap:主要用的是这个--优点:针对屏幕进行了优化,和平台相关----不可以对图片进行修改
QImage:和平台无关,可以对图片进行修改(改变某个点的像素值)--在线程中绘图
QPicture:保存绘图的状态(二进制文件)-----用于屏幕截图保存
8 QPixmap的使用
QPixmap pixmap(400,400);
pixmap.fill(Qt::white);
QPainter p(&pixmap);
p.drawPixmap(pixmap.rect(),QPixmap("../325724.jpg"));
pixmap.save("1.jpg");
9 QImage的使用
QImage imge(400,400,QImage::Format_ARGB32);
QPainter p(&imge);
p.drawImage(imge.rect(),QImage("../325724.jpg"));
imge.save("2.png");
10 QPicture的使用----以二进制的形式保存,需要加载才能显示
QPicture pic;
QPainter p;
p.begin(&pic); //在这里要用到begin()与end的结合区加载,否则搞不出来
p.drawPixmap(rect(),QPixmap("../325724.jpg"));
p.end();
pic.save("3.jpg");
---------------------------------------------------------------------
在paintEvent事件中的写法
QPicture pic;
pic.load("3.jpg");
QPainter p(this);
p.drawPicture(0,0,pic);
11 QImage与QPixmap之间的相互转换
QPixmap pix;
pix.load("../325724.jpg");
QImage img=pix.toImage();
QPainter p(this);
p.drawImage(0,0,img);
----------------------------------------------------------------------
QImage img;
img.load("../325724.jpg");
QPixmap pix=QPixmap::fromImage(img); //要通过这个静态函数去进行转换
QPainter p(this);
p.drawPixmap(rect(),pix);
12 不规则的图形
setWindowFlag(Qt::FramelessWindowHint); //去掉边框
setAttribute(Qt::WA_TranslucentBackground); //设置窗口背景透明
重写mouseMoveEvent与mousePressEvent两个函数实现窗口的可以移动
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::RightButton)
{
close();
}
else if(event->button()== Qt::LeftButton)
{
//求坐标差值
p=event->globalPos()-this->frameGeometry().topLeft(); //event->globalPos()点击时相对屏幕的点,frameGeometry().topLeft()窗口左上方的点
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos()-p); //在这里要注意的是,我们的移动都是以窗口的左上方为基础的移动,因此要写成这个event->globalPos()-p
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------over---------------------------------
来源:https://www.cnblogs.com/z2529827226/p/11871682.html