画家(QPainter)所使用的工具角色 — QPen:用于绘制几何图形的边缘,由颜色,宽度,线风格等参数组成 — QBrush:用于填充几何图形的调色板,由颜色和调色风格组成 — QFont:用于文本绘制,由字体属性组成
QPainter的基本绘图能力
重要规则 — 只能在 QWidget::paintEvent 中绘制图形
动态绘制图形的工程解决方案 1、根据需要确定 参数对象(绘图类型,点坐标,角度等) 2、将参数对象存入 数据集合中(如:链表) 3、在 paintEvent 函数中遍历数据集合 4、根据参数对象绘制图形(update())
update():如果我们想要强行的触发 QWidget 对象来进行重新绘制,那我们可以去调用update()函数。update()函数就会强制的要求当前的 QWidget 对象重新绘制自己的外观,这样paintEvent这个事件处理函数就会被调用。
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include <QPoint> #include <QList> class Widget : public QWidget { Q_OBJECT enum { LINE, RECT, ELLIPSE }; struct DrawParam { int type; Qt::PenStyle pen; QPoint begin; QPoint end; }; QPushButton m_testBtn; QList<DrawParam> m_list; protected slots: void onBtnClicked(); protected: void paintEvent(QPaintEvent* event); public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_Hwidget.cpp
#include "Widget.h" #include <QPainter> #include <QPoint> Widget::Widget(QWidget *parent): QWidget(parent) { m_testBtn.setParent(this); m_testBtn.move(400, 300); m_testBtn.resize(70, 30); m_testBtn.setText("Test"); resize(500, 350); connect(&m_testBtn, SIGNAL(clicked()), this, SLOT(onBtnClicked())); } void Widget::onBtnClicked() { DrawParam 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* event) { QPainter painter; painter.begin(this); for(int i = 0; i < m_list.count(); i++) { painter.setPen(m_list[i].pen); 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()); int h = qAbs(m_list[i].begin.y() - m_list[i].end.y()); 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(); } Widget::~Widget() { }main.cpp
#include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } 小结 — QPainter 是 Qt 中的关键绘图类 — QPainter 只能在 QPaintDevice 上绘制图形 — paintEvent() 是 Qt 中的绘图上下文 — 工程中通过改变绘图参数进行动态绘图