Qt Creator (5)————绘图与绘图设备

it2022-05-05  169

绘图QPainter:

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

QPainter用来执行绘制的操作;

QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;

QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。我们可以把QPainter理解成画笔。

下面我们通过一个实例来介绍QPainter的使用:

void Widget::paintEvent(QPaintEvent *) { //QPainter p(this); //创建画家对象,并指定当前窗口为绘图设备 QPainter p; p.begin(this); //画背景图 //p.drawPixmap(0,0,width(),height(),QPixmap("../Image/1.png")); p.drawPixmap(rect(),QPixmap("../Image/1.png")); //定义画笔,设置线宽 QPen pen; pen.setWidth(5); //设置颜色,风格 //pen.setColor(Qt::red); pen.setColor(QColor(14,9,234)); pen.setStyle(Qt::DashLine); //把画笔交给画家 p.setPen(pen); //画直线 p.drawLine(50,50,150,50); p.drawLine(50,50,50,150); //创建画刷对象 QBrush brush; brush.setColor(Qt::red); brush.setStyle(Qt::Dense1Pattern); //把画刷交给画家 p.setBrush(brush); //画矩形 p.drawRect(150,150,100,50); //画圆形 p.drawEllipse(QPoint(150,150),50,25); p.drawEllipse(QPoint(170,215),10,5); p.drawEllipse(QPoint(230,215),10,5); //画笑脸 //p.drawPixmap(x,180,80,80,QPixmap("../Image/face.png")); p.end(); }

 

绘图设备:

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。

QPixmap专门为图像在屏幕上的显示做了优化

QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。

QImage专门为图像的像素级访问做了优化。

QPicture则可以记录和重现QPainter的各条命令。

下面我们来看同一个图像文件在QPixmap和QBitmap下的不同表现:

void PaintWidget::paintEvent(QPaintEvent *) { QPixmap pixmap(":/Image/butterfly.png"); QPixmap pixmap1(":/Image/butterfly1.png"); QBitmap bitmap(":/Image/butterfly.png"); QBitmap bitmap1(":/Image/butterfly1.png"); QPainter painter(this); painter.drawPixmap(0, 0, pixmap); painter.drawPixmap(200, 0, pixmap1); painter.drawPixmap(0, 130, bitmap); painter.drawPixmap(200, 130, bitmap1); }

 

我们声明了一个QImage对象,大小是300 x 300,颜色模式是RGB32,即使用32位数值表示一个颜色的RGB值,也就是说每种颜色使用8位。然后我们对每个像素进行颜色赋值,从而构成了这个图像。我们可以把QImage想象成一个RGB颜色的二维数组,记录了每一像素的颜色。

QImage则是使用独立于硬件的绘制系统,实际上是自己绘制自己,因此提供了像素级别的操作,并且能够在不同系统之上提供一个一致的显示形式。

void PaintWidget::paintEvent(QPaintEvent *) { QPainter painter(this); QImage image(300, 300, QImage::Format_RGB32); QRgb value; //将图片背景填充为白色 image.fill(Qt::white); //改变指定区域的像素点的值 for(int i=50; i<100; ++i) { for(int j=50; j<100; ++j) { value = qRgb(255, 0, 0); // 红色 image.setPixel(i, j, value); } } //将图片绘制到窗口中 painter.drawImage(QPoint(0, 0), image); }

 

QPicture是平台无关的,因此它可以使用在多种设备之上,比如svg、pdf、ps、打印机或者屏幕。回忆下我们这里所说的QPaintDevice,实际上是说可以有QPainter绘制的对象。QPicture使用系统的分辨率,并且可以调整 QPainter来消除不同设备之间的显示差异。

这是一个可以记录和重现QPainter命令的绘图设备。 QPicture将QPainter的命令序列化到一个IO设备,保存为一个平台独立的文件格式。

void PaintWidget::paintEvent(QPaintEvent *) { QPicture pic; QPainter painter; //将图像绘制到QPicture中,并保存到文件 painter.begin(&pic); painter.drawEllipse(20, 20, 100, 50); painter.fillRect(20, 100, 100, 100, Qt::red); painter.end(); pic.save("D:\\drawing.pic"); //将保存的绘图动作重新绘制到设备上 pic.load("D:\\drawing.pic"); painter.begin(this); painter.drawPicture(200, 200, pic); painter.end(); }

 

不规则窗口:

对窗口里的图片进行去边框,并且可以进行随处移动

//widget.h class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: void paintEvent(QPaintEvent *); void mouseMoveEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); private: Ui::Widget *ui; QPoint p; }; //widget.cpp Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //去窗口边框 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //把窗口背景设置为透明 setAttribute(Qt::WA_TranslucentBackground); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *) { QPainter p(this); p.drawPixmap(0,0,QPixmap("../Image/2.png")); } void Widget::mousePressEvent(QMouseEvent *e) { if(e->button()==Qt::RightButton) { //如果是右键 close(); } else if(e->button()==Qt::LeftButton) { //求坐标差值 p=e->globalPos()-this->frameGeometry().topLeft(); } } void Widget::mouseMoveEvent(QMouseEvent *e) { if(e->buttons() & Qt::LeftButton) { move(e->globalPos()-p); } }

 


最新回复(0)