Qt 可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPaint、QPaintDevice和QPaintEngine 这三个类。
- QPainter: 用来进行绘图操作的类(把它当成一个画家)
- QPaintDevice: 抽象的二维界面,是中间媒介
- QPaintEngine: 提供了一些接口,可用于QPainter在不同的设备上进行绘制
QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作
QPainter 一般在控件的绘图事件 paintEvent() 中进行绘制,当窗口程序需要升级或重新绘制时,调用此成员函数。使用 repaint() 和 update()后,调用函数 paintEvent()。
QPainter的3个主要设置是: pen, brush, font
painter.setPen(QPen(..)): 笔
painter.setBrush(QBrush(..)): 填充
painter.setFont(QFont(..)):
painter.setRenderHint(QPinter::Antialiasing);
设置了brush之后,画的是效果即填充,QPainter的属性影响绘制的图形,通常使用painter.drawXXX(..)来绘制图形设置背景为白色:
setPalette(QPalette(Qt::white));
setAutoFillBackground(true);
- 画一个方块:
需要重载函数:void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w = this->width();
int h = this->height();
QRect rect(w/4, h/4, w/2, h/2);
painter.drawRect(rect);
}
- 用笔把方块的边替换掉:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w = this->width();
int h = this->height();
QPen pen;
pen.setWidth(20);
pen.setColor(Qt::red);
pen.setStyle(Qt::DashDotLine);
pen.setJoinStyle(Qt::RoundJoin);
painter.setPen(pen);
QRect rect(w/4, h/4, w/2, h/2);
painter.drawRect(rect);
}
- 用brush把方块内部填充上黄色:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w = this->width();
int h = this->height();
QPen pen;
pen.setWidth(20);
pen.setColor(Qt::red);
pen.setStyle(Qt::DashDotLine);
pen.setJoinStyle(Qt::RoundJoin);
painter.setPen(pen);
QBrush brush;
brush.setColor(Qt::yellow);
brush.setStyle(Qt::Dense7Pattern);
painter.setBrush(brush);
QRect rect(w/4, h/4, w/2, h/2);
painter.drawRect(rect);
}
- 画一个图片:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w = this->width();
int h = this->height();
QRect rect(w/4, h/4, w/2, h/2);
QImage image(":/images/images/flower.jpeg");
painter.drawImage(rect, image);
}
- 画一些字,字要是红色的:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w = this->width();
int h = this->height();
QPen pen;
pen.setWidth(20);
pen.setColor(Qt::red);
pen.setStyle(Qt::DashDotLine);
pen.setJoinStyle(Qt::RoundJoin);
painter.setPen(pen);
QRect rect(w/4, h/4, w/2, h/2);
QFont font;
font.setBold(true);
font.setPointSize(20);
painter.setFont(font);
painter.drawText(rect, "Hello World.");
}
- 画3个点并连成一条线:
QPoint points[] = {QPoint(w/3, h/3), QPoint(w/2, h/2), QPoint(w/2, 2*h/3)};
painter.drawPolyline(points, 3);