繪圖(QPainter)

QPainter、QPaintEngine、QPaintDevice組成了Qt的繪圖系統,QPainter提供繪圖API,使用QPaintEngine作為介面,在QPaintDevice進行繪圖,所以像QWidget、QImage、QPicture、QPrinter這些QPaintDevice的子類別,只要建立QPainter就可在上面進行繪製,除非需要自定義一個設備,否則不需要關心QPaintEngine這個類別。

QPainter

通常會重新定義paintEvent()函式,當繪圖裝置(QPaintDevice)需要重繪時,就會發出QPaintEvent事件,並分派給paintEvent()來處理,例如元件出現、被覆蓋或又重現時。QPainter提供各種繪製圖形的API,從基本的線繪製、方塊、矩形、圓形、漸層到複雜的圖片等,這邊示範直線、矩形、橢圓、文字、圖形的繪製。


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *);
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setWindowTitle(tr("繪圖"));
}

void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    painter.drawLine(10, 10, 80, 60);        //指定x、y、width、height繪製線條
    painter.setPen(Qt::green);               //指定畫筆顏色
    painter.drawRect(100, 10, 50, 80);       //指定x、y、width、height繪製矩形
    painter.setPen(QPen(Qt::red, 5));        //指定畫筆顏色和粗細
    painter.setBrush(Qt::blue);              //指定筆刷顏色,可以想成物體的填充色
    painter.drawEllipse(10, 100, 200, 100);  //指定x、y、width、height的矩形,繪製橢圓於內

    painter.setFont(QFont("Arial", 30));
    painter.drawText(200, 10, 150, 80, Qt::AlignCenter, tr("哈囉! Qt"));

    painter.drawPixmap(220, 100, QPixmap("icon.jpg")); // 繪製圖片

    painter.setBrush(Qt::yellow);
    QPointF points[4] = {QPointF(10.0, 250.0), QPointF(5.0, 270.0), QPointF(50.0, 280.0), QPointF(70.0, 220.0)}; //給點逆時針畫出
    painter.drawConvexPolygon(points, 4);
} 

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(400,300);
    w.show();

    return a.exec();
}

QPainter


  • QPainter依程式碼順序繪圖,假設位置有重疊,重疊處後者會覆蓋前者。
  • 當我們設置了QPainter參數,例如畫筆顏色,除非重新設置顏色,否則我們下次就是以此參數繪圖。