QPainter抹剩、QPaintDevice撑帖、QPaintEngine的介紹-畫筆&畫刷&漸變

QPainter祟绊、QPaintDevice毁渗、QPaintEngine的介紹

QPainter 用來執(zhí)行繪圖操作; QPaintDevice提供繪圖設(shè)備停做,是一個(gè)二維空間的抽象钳踊,可以使用QPainter在其上進(jìn)行繪制衷敌;是所有可以進(jìn)行繪制的基類,其子類有QWidget拓瞪、QPixmap缴罗、QPicture、QImage吴藻、QPainter和QOpenGLPaintDevice等瞒爬。QPaintEngine提供了一些接口,用于QPainter和QPaintDevice內(nèi)部沟堡。使得QPainter可以在不同的設(shè)備上進(jìn)行繪制侧但。

1、繪制與填充

QPainter::QPainter(QPaintDevice *device) 航罗;

QPainter 構(gòu)造中device為繪圖設(shè)備禀横;使用這個(gè)構(gòu)造函數(shù)創(chuàng)建的對象會(huì)立即開始在設(shè)備上進(jìn)行繪制,自動(dòng)繪制掉用begin()函數(shù)粥血,然后在QPainter的析構(gòu)造函數(shù)中調(diào)用end()函數(shù)結(jié)束繪制柏锄。

QPainter中的圖形繪制函數(shù)

*   drawLine() 繪制線條
*   drawArc()   繪制圓弧
*   drawChord() 繪制弦
*   drawConvexPolygon() 繪制凸多邊形
*   drawEllipse() 繪制橢圓
*   drawPie() 繪制扇形
*   drawPoint() 繪制點(diǎn)
*   drawPolygon() 繪制多邊形
*   drawRect() 繪制矩形
*   drawRoundedRect() 繪制圓角矩形

2、畫筆

在paintEvent()函數(shù)中繼續(xù)添加如下代碼

QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin); // 創(chuàng)建畫筆
painter.setPen(pen); // 使用畫筆
QRectF rectangle(70.0, 40.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 *16;
painter.drawArc(rectangle, startAngle,  spanAngle); //繪制圓弧

QPen類為QPainter提供了畫筆來繪制線條和形狀的輪廓复亏,這里使用QPen::QPen(const QBrush& brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin);其中幾個(gè)參數(shù)分別是畫刷(為畫筆提供顏色)趾娃,線寬(默認(rèn)為0,一個(gè)像素)缔御、畫筆風(fēng)格(有實(shí)線抬闷、點(diǎn)線等,還有一個(gè)Qt::NoPen值表示不進(jìn)行線條或邊框的繪制,還可以使用setDashPatten()來指定以一個(gè)畫筆風(fēng)格)笤成、畫筆端點(diǎn)風(fēng)格(怎樣定制線條端點(diǎn)的繪制其中Qt::SquareCap風(fēng)格表示線條的終點(diǎn)為方形评架,并延長了線寬的一半)、畫筆連接風(fēng)格(兩條線段的連接炕泳,Qt::BeveJoin 風(fēng)格填充了兩個(gè)線條之間的空卻三角形)纵诞;

也可以使用setBrush()、setWidth()培遵、setStyle()浙芙、setCapStyle()和setJoinStyle()等函數(shù)設(shè)置。

3荤懂、畫刷

在paintEvent()方法中繼續(xù)添加畫刷功能

    painter.drawRect(160, 20, 50, 40); //繪制一個(gè)矩形
    QBrush brush(QColor(0,0, 255), Qt::dense4Pattern);//創(chuàng)建畫刷
    painter.setBrush(brush);// 使用畫刷
    painter.drawEllipse(220, 20, 50, 50); // 繪制橢圓
    brush.setTexture(QPixmap("../image/bg.png")); // 設(shè)置紋理
    painter.setBrush(brush); // 重新使用畫刷
    
    // 繪制多邊形
    static const QPointF points[4] = {
        QPointF(270.0, 80.0),
        QPointF(290.0, 10.0),
        QPointF(350.0, 30.0),
        QPointF(390.0, 70.0) 
    };
    painter.drawPolygon(points, 4);

QBrush類提供了畫刷來對圖形進(jìn)行填充茁裙,所以QBrush的定義包含了顏色和風(fēng)格(填充模式)塘砸。顏色由QColor類來表示他支持RGB节仿、HSV及CMYK等顏色模型。QColor還支持基于alpha的輪廓和填充(透明效果)掉蔬。

3廊宪、漸變填充

QGradient類和QBrush類一起完成漸變填充。Qt支持3中類型的漸變填充:

  • 線性漸變 linear gradient:開始點(diǎn)和結(jié)束點(diǎn)之間填充顏色女轿;
  • 輻射漸變 radial gradient :在焦點(diǎn)和環(huán)繞他的圓環(huán)間插入顏色箭启;
  • 錐形漸變 Conical gradient:在圓心周圍插入顏色。
//線性漸變

QLinearGradient linearGradient(QPointF(40, 190), QPointF(70, 200)); 
//insert color
linearGradient.setColorAt(0, Qt::yellow);
linearGradient.setColorAt(0.5, Qt::red);
linearGradient.setColorAt(1, Qt::blue);
// 指定漸變區(qū)域意外的區(qū)域的擴(kuò)散方式
linearGradient.setSpread(QGradient::RepeatSpread); 
//使用漸變作為畫刷
painter.setBrush(linearGradient);
painter.drawRect(10, 170, 90, 40);

// 輻射漸變
/* 
  輻射漸變 QRadialGradient::QradialGradient(const QPointF& center, qreal radius, const QPointF & foacalPoint);
    輻射漸變構(gòu)造函數(shù)需要指定圓心center, 半徑radius蛉迹,就可以確定一個(gè)圓傅寡,在指定一個(gè)焦點(diǎn)focalPoint,在焦點(diǎn)和圓環(huán)之間插入顏色
*/
QRadialGradient radialGradient(QPointF(200, 190), 50, QPointF(275, 200));
radialGradient.setColorAt(0, QColor(255, 255, 100, 150);
radialGradient.setColorAt(1, QColor(0, 0, 0, 50);
painter.setBrush(radialGradient);
painter.drawEllipe(QPointF(200, 190), 50, 50);
//錐形漸變
/*
QConicalGradient::QConicalGradient(const QPointF &center, qreal angle) ;
錐形漸變的構(gòu)造函數(shù)需要指定center中心點(diǎn)北救,和一個(gè)角度angle(0-360)荐操,然后逆時(shí)針旋轉(zhuǎn),setSpread函數(shù)對于錐形漸變沒有效果珍策。
*/
QConicalGradient conicalGradient(QPointF(350, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient );
painter.drawEllipe(QPointF(400, 190), 50, 50);
//畫筆使用線性漸變來繪制直線和文字
painter.setPen(QPen(linearGradient, 2));
painter.drawLine(0, 280, 100, 280);
painter.drawText(150, 280, tr("helloQt"));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末托启,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子攘宙,更是在濱河造成了極大的恐慌屯耸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹭劈,死亡現(xiàn)場離奇詭異疗绣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铺韧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門多矮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祟蚀,你說我怎么就攤上這事工窍「盥簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵患雏,是天一觀的道長鹏溯。 經(jīng)常有香客問我,道長淹仑,這世上最難降的妖魔是什么丙挽? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮匀借,結(jié)果婚禮上颜阐,老公的妹妹穿的比我還像新娘。我一直安慰自己吓肋,他們只是感情好凳怨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是鬼,像睡著了一般肤舞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上均蜜,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天李剖,我揣著相機(jī)與錄音,去河邊找鬼囤耳。 笑死篙顺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的充择。 我是一名探鬼主播德玫,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聪铺!你這毒婦竟也來了化焕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤铃剔,失蹤者是張志新(化名)和其女友劉穎撒桨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體键兜,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凤类,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了普气。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谜疤。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夷磕,到底是詐尸還是另有隱情履肃,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布坐桩,位于F島的核電站尺棋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绵跷。R本人自食惡果不足惜膘螟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碾局。 院中可真熱鬧荆残,春花似錦、人聲如沸净当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚯瞧。三九已至嘿期,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埋合,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工萄传, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甚颂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓秀菱,卻偏偏與公主長得像振诬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子衍菱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容