一、Qt操作图片
-
设置背景图
新建Widget项目,在.h头文件中定义paintEvent(QPaintEvent *e) 需要导入头文件Widget.h protected: // 重写绘图时间,虚函数 // 如果在窗口内绘图,必须放在绘图事件里实现 void paintEvent(QPaintEvent *event); Widget.cpp void Widget::paintEvent(QPaintEvent *event){ // QPainter p(this); 创建的时候直接指定父对象 QPainter p; p.begin(this); // 绘图操作 // 画背景图, 图片路径不放在Resource下,写绝对路径也可以 // p.drawPixmap(0, 0, width(), height(), QPixmap("../Image/back.jpg")); // rect可以直接获取到当前窗口的大小 p.drawPixmap(rect(), QPixmap("../Image/back.jpg")); p.end(); }
-
画笔画线、矩形等等(填充颜色)
导入头文件QPen 画笔 QBrush 填充颜色 (默认改变窗口大小就会重新进行刷新绘制)QPainter p; // 定义画笔 QPen pen; pen.setWidth(5); // 设置线宽 // pen.setColor(Qt::red); // 设置Qt的颜色 pen.setColor(QColor(3, 212, 200)); // 设置rgb颜色 pen.setStyle(Qt::DashLine); // 设置画笔线的类型 p.setPen(pen); // 给Painter设置画笔 // 设置画刷 QBrush brush; brush.setColor(Qt::red); // 设置画刷颜色 brush.setStyle(Qt::Dense1Pattern); // 设置画刷格式 p.setBrush(brush); // 画直线 p.drawLine(50, 50, 80, 80); p.drawLine(0,0, width(), height()); // 画矩形 p.drawRect(10,20, 80, 80); // 画圆, 后边两个参数是上边距和下边距 p.drawEllipse(QPoint(150, 150), 50, 25);
-
手动刷新重绘
在界面中添加按钮点击事件,使用Qt自带 update()方法更新页面x = 0; // 自定义x // 添加图片 p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/player.png")); void Widget::on_pushButton_clicked() { x += 20; if(x > width()){ x = 0; } // 刷新窗口 update(); // 默认刷新整体窗口, 也可以选择刷新指定控件 }
-
QBitMap和QPixMap
QBitMap:灰白图片
QPixMap: 彩色图片void PixAndBitMap::paintEvent(QPaintEvent *event){ QPainter p(this); // 背景图片透明的 p.drawPixmap(0, 0, QPixmap("../Image/fish.png")); // 背景不透明的 p.drawPixmap(300, 0, QBitmap("../Image/fish.png")); // p.drawPixmap(200, 0, QPixmap("../Image.player.png")); // 另外一种文件加载的方法 QPixmap pixmap; pixmap.load("../Image/fish1.png"); p.drawPixmap(0, 300, pixmap); QBitmap bitmap; bitmap.load("../Image/fish1.png"); p.drawPixmap(300, 300, bitmap); }
-
其他绘图方式
- QPixmap:针对屏幕进行优化,和平台相关
- QImage: 和平台无关,可以对图片进行修改,在线程中绘图
- QPictrue: 保存绘图的状态(二进制文件)
QImage.cpp
void MyQImage::paintEvent(QPaintEvent *event){ QImage qImage1(); // 创建一个绘图设备 QImage qImage(400, 300, QImage::Format_ARGB32); // Format_ARG32背景图是透明色 QPainter p; // 创建画笔 p.begin(&qImage); // 初始化绘图设备 p.drawImage(100, 100, QImage("../Image/fish.png")); //p.drawPixmap(100, 100, QImage("../Image/fish.png")); // 可以对图像的像素点进行操作 for(int i=0; i<50; i++){ for(int j=0; j<50; j++){ // 对绘图设备的前50个像素点进行操作 qImage.setPixel(i, j, qRgb(0, 255, 0)); } } p.end(); qImage.save("../Image/QImage.png"); }
Qpicture.cpp
// 保存图片函数 QPicture picture; QPainter p; p.begin(&picture); p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/fish.png")); p.drawLine(50, 50, 150, 150); p.end(); picture.save("../Image/Qpicture.png"); // 加载图片函数 QPicture pic; pic.load("../Image/Qpicture.png"); QPainter p(this); p.drawPicture(0, 0, pic);
-
QPixmap和QImage转换
QPainter painter(this); // QPixMap->QImage QPixmap pixmap; pixmap.load("../Image/fish.png"); QImage tempImage = pixmap.toImage(); painter.drawImage(0, 0, tempImage); // QImage->QPixMap QImage qImage; qImage.load("../Image/save.jpg"); QPixmap temPix = QPixmap::fromImage(qImage); painter.drawPixmap(100, 0, temPix)
二、不规则窗口
-
先去除窗口边框,给窗体中添加入不规则图形
// 去窗口边框
setWindowFlags(Qt::FramelessWindowHint | windowFlags()); -
设置窗体背景色为透明
// 窗口背景设置为头透明
setAttribute(Qt::WA_TranslucentBackground); -
设置鼠标事件(拖拽窗体、关闭、最小化)
QPoint p; // 用来存储窗体移动的距离
// 移动窗体
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);// 去窗口边框 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); // 设置窗体背景色透明 setAttribute(Qt::WA_TranslucentBackground); void Widget::mousePressEvent(QMouseEvent *event){ if(event->button() == Qt::RightButton){ close(); // 右键关闭窗口 } else if(event->button() == Qt::LeftButton){ // 求坐标差值 p = event->globalPos() - this->frameGeometry().topLeft(); } } void Widget::mouseMoveEvent(QMouseEvent *event){ if(event->buttons() & Qt::LeftButton){ move(event->globalPos() - p); } }