继承关系
QPaintDevice->QPixmap->QBitmap
QPaintDevice->QImage
QPaintDevice->QPicture
区别
共同点
- 都继承于QPaintDevice, 是绘图设备。也就是说QPainter能够在任何QPainteDevice的子类上进行绘制。
不同点
- QPixmap
- 专门为图像在屏幕上的显示做了优化
- 在不同的操作系统平台下,QPixmap的显示可能有所差别(因为QPixmap依赖于所在平台的绘图引擎)
- QBitmap
- QBitmap是QPixmap的一个子类(因此具有QPixmap的所有特性)。它的色深限定为1,可以使用
QPixmap
的isQBitmap()
函数来确定这个QPixmap
是不是一个QBitmap
- QBitmap所表示的颜色就只有两种:黑,白(QBitmap实际上是只有黑白两色的图像数据)
- 由于QBitmap色深小(色深限定为1),因此占用存储控件少,适合做光标文件和笔刷
- QImage
- 主要是用于图像IO、图片访问和像素修改,专门为图像的像素级访问做了优化。
- 使用Qt自身的绘图引擎,可在不同平台上具有相同的显示效果。
- 提供了像素级别的操作
- QImage是独立于硬件,可以在另一个线程中对其进行绘制,不需要在GUI线程中处理(可以提高UI响应速度)
- QPicture
- 可以记录和重现QPainter的各条命令:QPicture将QPainter的命令序列化到一个IO设备,保存为一个平台独立的文件格式。
Demo
QPixmap
void PaintDeviceDemo::drawPixmap(QPainter& painter)
{
QPixmap pixmap(":/setting");
QRect rect(0, 0, 100, 100);
painter.drawPixmap(rect, pixmap, pixmap.rect());
}
QBitmap
void PaintDeviceDemo::drawBitmap(QPainter& painter)
{
QBitmap bitmap(":/setting");
QRect rect(100, 0, 100, 100);
painter.drawPixmap(rect, bitmap, bitmap.rect());
// 如果图片中有白色,则用QBitmap加载时不会显示白色部分
// 如果图片中有透明色,则用QBitmap加载时会转换成黑色
}
QImage
void PaintDeviceDemo::drawImage(QPainter& painter)
{
QImage image(":/setting");
QColor red(255, 0, 0);
image.setPixelColor(0, 0, red);
painter.drawImage(QRect(200, 0, 100, 100), image, image.rect());
}
QPicture
PaintDeviceDemo::PaintDeviceDemo(QWidget *parent)
: QWidget(parent)
{
// 绘制一个矩形,并保存到rect.pic文件中
QPicture picture;
QPainter painter;
drawPicture(painter,"rect.pic");
// 在paintEvent函数中调用loadPicture函数
}
void PaintDeviceDemo::loadPicture(const QString& path,QPainter& painter)
{
QPicture picture;
picture.load(path);
uint size = picture.size();
painter.begin(this);
painter.drawPicture(0, 100, picture);
painter.end();
}
运行结果截图
目录