11、画图
1、QPainter--->QPaintEngine----->QPaintDevice
画家 、画图设备:画在哪里;
重写虚函数 绘图事件 paintEvent();
如果在窗口绘图,必须放在绘图事件中实现;
绘图事件会自动调用,窗口需要重新绘制的时候,窗口状态改变
2、虚函数实现
// 指定画图设备 //QPainter p(this); // 指定当前窗口绘图 QPainter p1; // 第二种方法 p1.begin(this); // 指定当前窗口绘图 与p1.end();结合使用 // 画背景图 // p1.drawPixmap(0,0,width(),height(),QPixmap("path")); // 画背景图 //p1.drawPixmap(rect(),Qpixmap("pat")); //p1.drawLine();// 画直线 // 定义画笔 QPen pen; pen.setColor(Qt::red); // 画笔设置颜色 pen.setColor(QColor(12,23,45)); pen.setStyle(Qt::DashLine); // 设置线性 pen.setWidth(5); // 设置线宽 p1.setPen(pen); // 画笔交给画家 // 创建画刷对象 QBrush brush; brush.setColor(Qt::red); // 设置画刷颜色 brush.setStyle();// 设置画刷格式 p1.setBrush(brush); // 画刷交给画家 // 画矩形 //p1.drawRect(); // 画圆 //p1.drawEllipse(QPaint(150,150),50,25); p1.end();
3、手动更新绘图事件
按钮按下,图片向右边移动
// 画图片 p1.drawPixmap(x,120,80,80,QPixmap("../b7.ico")); p1.end();
按钮槽函数
// 按钮槽函数 手动更新绘图事件 void Widget::on_pushButton_clicked() { x += 20; // 移动图片 if(x > width()) { x = 0; } update(); // 更新整个窗口 间接调用paintEvent() }
4、QBitmap继承于QPixmap
QBitmap只有两种颜色,黑白;
QPixmap主要画彩色;
// 画图片 图片背景透明 p1.drawPixmap(x,120,80,80,QPixmap("../b7.ico")); // 彩色图片 p1.drawPixmap(100,0,QBitmap("../b7.ico")); // 黑白图片 // 图片背景白色 QBitmap bitmap; bitmap.load(""); // 加载图片 p1.drawPixmap(100,0,bitmap); // 黑白图片 // 先加载图片 再花图片 QPixmap pixmap; pixmap.load(""); // 加载图片 图片背景白色 p1.drawPixmap(x,120,80,80,pixmap); // 彩色图片
5、绘图设备
QPixmap:比较常用,经过优化的,与平台有关;不能对像素点修改;
QImage:与平台无关,可以对图片、像素级修改;可以在线程中绘图;
QPicture:保存绘图的状态,保存二进制文件
1、QPixmap
QPixmap pixmap(400,300); // 指定绘图设备的大小 绘图设备默认为黑色 QPainter p(&pixmap); // 给画家指定绘图设备 pixmap.fill(Qt::white); // 绘图设备背景填充为白色 // 或者画家将绘图设备画成白色 //p.fillRect(0,0,400,300,QBrush(Qt::white)); // 画图片 p.drawPixmap(0,0,80,80,QPixmap("../b7.ico")); // 保存图片 可以指定常见的格式 pixmap.save("../bird.png");
2、QImage
// 绘图设备初始化400*300 背景透明QImage::Format_ARGB32 QImage image(400,300,QImage::Format_ARGB32); QPainter p; p.begin(&image); // 指定绘图设备 p.drawImage(0,0,QImage("../b7.ico")); for(int i=0;i<50;i++) { for(int j=0;j<50;j++) { // 修改像素点颜色 image.setPixel(QPoint(i,j),qRgb(0,255,255)); // 获取像素点 // image.pixel(QPoint(i,j)); } } p.end(); // 保存图片 查看图片软件打开 image.save("../image.png");
3、QPicture
// QPicture // 画图片 QPicture pic; QPainter p; p.begin(&pic); p.drawPixmap(0,0,QPixmap("../b7.ico")); p.drawLine(50,50,150,50); p.end(); pic.save("../pic.png"); // 画图片信息保存到本地 // 读保存的画图信息 void Widget::paintEvent(QPaintEvent *e) { // 读图片 QPicture pic; pic.load("../pic.png"); // 加载图片 QPainter p(this); p.drawPicture(0,0,pic); // 画图 }
6、QPixmap与QImage之间转换,其余的正常画图
1、 QPixmap 转为QImage
// QPixmap转为QImage QPixmap pix; pix.load("../b7.ico"); QImage img = pix.toImage(); // QPixmap 转为QImage
2、将QImage 转为QPixma
QImage imgae; imgae.load("../b7.ico"); QPixmap pmap = QPixmap::fromImage(imgae); // 将QImage 转为QPixma
7、不规则窗口
1、去掉边框
2、设置窗口背景透明
3、重写鼠标事件
// 窗口边框设置 // 原来的边框配置与 去除边框相或 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); // 窗口背景设置为透明 setAttribute(Qt::WA_TranslucentBackground);
void Widget::paintEvent(QPaintEvent *e) { QPainter p(this); // 绘制图片 p.drawPixmap(0,0,300,500,QPixmap("../sheep.jpg")); } void Widget::mouseMoveEvent(QMouseEvent *e) { if(e->buttons() & Qt::LeftButton) { move(e->globalPos() - p); // 当前鼠标点击位置 -距离差 图片跟随鼠标一起运动 } } void Widget::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { close(); }else{ // 求坐标差值 // 当前点击坐标-窗口右上角坐标 p = e->globalPos() - this->frameGeometry().topLeft(); // 边框的左上角坐标 } }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号