Qt 第66课、基础图形绘制(上)

    科技2022-09-01  125

    Qt 图形系统中的关键角色 — QPainter   Qt 中的画家,能够绘制各种基础图形   拥有绘图所需的画笔(QPen),画刷(QBrush),字体(QFont) — QPaintDevice   Qt 中的画布,画家(QPainter)的画图板   所有的 QWidget 都继承自 QPaintDevice

    画家(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_H

    widget.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 中的绘图上下文 — 工程中通过改变绘图参数进行动态绘图
    Processed: 0.013, SQL: 9