QT 图形绘制大全
?
1. 繪制圖形
protected:
void paintEvent(QPaintEvent *);
void Widget::paintEvent((QPaintEvent *event)
{
QPainter painter(this); //this為繪圖設(shè)備,即表明在該部件上進(jìn)行繪制
painter.drawLine(QPaint(0, 0), QPaint(100, 100));
}
QPainter painter(this); // 會(huì)立即開(kāi)始在設(shè)備上繪制,自動(dòng)調(diào)用begin()函數(shù),然后析構(gòu)函數(shù)中調(diào)用end()函數(shù)結(jié)束繪制。
QPainter painter;// 不帶參數(shù)時(shí),可以在后面調(diào)用QPainter::begin(QPaintDevice *device)來(lái)指定繪制設(shè)置,然后用完再調(diào)用end()函數(shù)。
等價(jià)于
void Widget::paintEvent((QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.drawLine(QPaint(0, 0), QPaint(100, 100));
painter.end();
}
2. 使用畫(huà)刷
畫(huà)刷可以設(shè)置顏色和填充模式
QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);
painter.setBrush(brush);
3. 使用畫(huà)筆
//參數(shù)為:畫(huà)刷,線寬,畫(huà)筆風(fēng)格,畫(huà)筆端點(diǎn),畫(huà)筆連接風(fēng)格
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
4. 繪制矩形
painter.drawRect(0, 0, 100, 80); //x,y,w,h5. 繪制橢圓(圓)
painter.drawEllipse(0, 0, 100, 80); //x,y,w,h6. 繪制圓弧
QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h
int startAngle = 30 * 16; //值為,實(shí)際角度 * 16
int spanAngle = 120 * 16;
//三個(gè)參數(shù):rect表示弧線所在的矩形,startAngle起始角度,spanAngle跨越角度
painter.drawArc(rect, startAngle, spanAngle);
7. 繪制扇形
QRectF rect_top(20.0, 20.0, 100.0, 100.0);
// 扇形起始角度
int startAngle = 0 * 16;
// 扇形覆蓋范圍(120度的)
int spanAngle = 120 * 16;
painter.drawPie(rect_top, startAngle, spanAngle);
8. 繪制多邊形
QPolygon pts;
pts.setPoints(3, -1,0, 1,0, 0,39); //第一個(gè)參數(shù)表示3個(gè)點(diǎn),后面是三個(gè)點(diǎn)坐標(biāo)
painter.drawConvexPolygon(pts);
9. 繪制路徑
QPainterPath path;
path.addEllipse(-4, -4, 8, 8);//添加一個(gè)圓
path.addRect(-5, -5, 10, 10); //添加一個(gè)矩形
painter.drawPath(path);
在填充路徑時(shí)要用到填充規(guī)則,這里一共有兩個(gè)填充規(guī)則
path.setFillRule(Qt::OddEventFil);//奇偶填充規(guī)則
如果要判斷一個(gè)點(diǎn)是否在圖形中,可以從該點(diǎn)向圖形外引一條水平線,如果該水平線與圖形的交點(diǎn)人個(gè)數(shù)為奇數(shù),那么該點(diǎn)在在圖形中。
只填充在圖形內(nèi)的點(diǎn)
path.setFillRule(Qt::WindingFill); //非零彎曲規(guī)則
如果要判斷一個(gè)點(diǎn)是否在圖形中,可以從該點(diǎn)向圖形外引一條水平線,如果該水平線與圖形的邊線相交,這個(gè)邊線是順時(shí)針繪制的,就記為1,是逆時(shí)針繪制的就記為-1,然后將所有數(shù)值相加,結(jié)果不為0,那么該點(diǎn)就在圖形中。
10. 繪制圓環(huán)
根據(jù)以上的填充規(guī)則,可以得到繪制圓環(huán)的一個(gè)方便的方法
QPainterPath path;
path.addEllipse(0,0,100,100);
path.addEllipse(25,25,50,50);
painter.setBrush(Qt::blue);
path.setFillRule(Qt::OddEventFil);//使用奇偶填充,剛好可以只顯示圓環(huán)
painter.drawPath(path);
11. 填充與擦除
//使用畫(huà)刷填充一個(gè)矩形區(qū)域
painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));
//擦除一個(gè)矩形區(qū)域的內(nèi)容
painter.eraserRect(QRect(50,0,50,120));
//繪制曲線************************************************************************************
功能描述:用曲線來(lái)顯示數(shù)據(jù)的變化情況。橫坐標(biāo)表示時(shí)間T,縱坐標(biāo)Y。每隔一定時(shí)間取一個(gè)Y值確定縱坐標(biāo)
?
點(diǎn)擊(此處)折疊或打開(kāi)
QT 繪制事件 PaintEvent
對(duì)事件的響應(yīng)是通過(guò)信號(hào)與槽調(diào)用
???? 事件中根據(jù)事件觸發(fā)的條件發(fā)出不同的信號(hào)
???? 比如:鼠標(biāo)事件發(fā)出clicked與dblclicked等信號(hào)
????
QT中事件是怎么實(shí)現(xiàn)的?
? QT把事件自己定義成固定的virtual保護(hù)函數(shù)
? 這些函數(shù)自動(dòng)被系統(tǒng)調(diào)用
?
1.??????paintEvent
案例:
1.??????覆蓋QWidget的paintEvent
繪制gdi(Graphics DrawInterface)
代碼:
main.cpp
#include<QApplication>
#include<QWidget>
#include “PaintWidget.h”
int??main(int? args , char? **argv)
{
????QApplication? app(args , argv);
????PaintWidget w;
????w.resize(400,400);
????w.setVisible(true);
???? return? app.exec();
}
?
main.pro
TEMPLATE=app
SOURCES=main.cpp PaintWidget.cpp
HEADERS=PaintWidget.h
CONFIG=release qt
QT=core gui
TARGET=main
?
?
PaintWidget.h
#ifndef PAINT_WIDGET_H
#define PAINT_WIDGET_H
#include<QWidget>
#include<QPaintEvent>
class?PaintWidget:public QWidget
{
protected:
??????virtual void paintEvent( QPaintEvent * e);
};
#endif
?
PaintWidget.cpp
?
#include “PaintWidget.h”
#include<QPainter>
#include<QPoint>
#include<QImage>
#include<QPixmap>
#include<QBitmap>
#include<QPen>
?
void?PaintWidget::paintEvent(QPaintEvent * e)
{
?????QPoint p[3];
?????p[0].setX(10);
?????p[0].setY(10);
?????p[1].setX(300);
?????p[1].setY(10);
?????p[2].setX(145);
?????p[2].setY(200);
?????QImage img(“ok.png”);
?????QPixmap? map(“ok.png”);
?????QBitmap? bit=map.createMaskFromColor(QColor(0,0,0));
//?????QPen pen(QColor(255,0,0));
?????QBrush br(QColor(0,255,0));
??????QPen pen();
?????
? ????//純黑色設(shè)置為透明
?????//進(jìn)行繪制工作
?????//1.產(chǎn)生繪制對(duì)象QPainter
?????QPainter? g(this);? //this參數(shù)指定繪制的目標(biāo)
?????//2.設(shè)置繪制對(duì)象的屬性
?????g.setPen(pen);
?????g.setFont(“楷書(shū)”,45,100);?? //設(shè)置字體
?????//3.進(jìn)行繪制:圖形,圖像與字符串
?????g.drawLine(10,10,400,400);
?????g.drawArc(10,10,300,300,10*16,120*16);
?????//前4個(gè)參數(shù)為弧的外切矩形,參數(shù)5,6為起始角度和結(jié)束角度,1/16度數(shù)
?????g.drawConvexPolygon(p,3);? //參數(shù)2為多邊形的頂點(diǎn)個(gè)數(shù)
?????g.drawEllipase(0,0,this->width(),this->height());
?????g.drawText(100,100, “this is a maomaochong”);
?????g.drawImage(10,10,img);
? ????g.drawPixmap(10,10,300,300,bit);?
}
?
?
?
總結(jié)
- 上一篇: 领域驱动设计:浅析 VO、DTO、DO、
- 下一篇: JS 中 Map 与 JSON 转换