QPainter 类在小部件和其他绘画设备上执行低级绘画。
QPainter 提供高度优化的功能来完成大多数绘图 GUI 程序所需的工作。 它可以绘制从简单线条到复杂形状(如馅饼和和弦)的所有内容。 它还可以绘制对齐的文本和像素图。 通常,它在“自然”坐标系中绘制,但它也可以进行视图和世界变换。 QPainter 可以对任何继承 QPaintDevice 类的对象进行操作。画家由 begin() 函数和接受 QPaintDevice 参数的构造函数激活。 end() 函数和析构函数将其停用。当paintdevice 是一个widget 时,QPainter 只能在paintEvent() 函数中或在paintEvent() 调用的函数中使用。
源码分析:
void Widget::onTestBtnClicked()
{
DrawPara dp =
{
qrand() % 3,
static_cast<Qt::PenStyle>(qrand() % 5 + 1),
QPoint(qrand() % 400, qrand() % 300),
QPoint(qrand() % 400, qrand() % 300)
};
if( m_list.count() == 5 )
{
m_list.clear();
}
m_list.append(dp);
update();
}
void Widget::paintEvent(QPaintEvent*)
{
QPainter painter;
painter.begin(this);
for(int i=0; i<m_list.size(); i++)
{
int x = (m_list[i].begin.x() < m_list[i].end.x() ? m_list[i].begin.x() : m_list[i].end.x());
int y = (m_list[i].begin.y() < m_list[i].end.y() ? m_list[i].begin.y() : m_list[i].end.y());
int w = qAbs(m_list[i].begin.x() - m_list[i].end.x()) + 1;
int h = qAbs(m_list[i].begin.y() - m_list[i].end.y()) + 1;
painter.setPen(m_list[i].style);
switch (m_list[i].type)
{
case LINE:
painter.drawLine(m_list[i].begin, m_list[i].end);
break;
case RECT:
painter.drawRect(x, y, w, h);
break;
case ELLIPSE:
painter.drawEllipse(x, y, w, h);
break;
default:
break;
}
}
painter.end();
}
源码链接:https://download.csdn.net/download/weixin_41937297/36789385