【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充

概述 Qt 的繪圖系統(tǒng)可以使用相同的 API 在屏幕和打印設(shè)備上進(jìn)行繪圖,并且主要基于 QPainter , QPaintDevice 和 QPaintEngine 類。 QPainter 用于執(zhí)行繪圖操作, QPaintDevice 是一個(gè)二維空間的抽象,


概述

Qt的繪圖系統(tǒng)可以使用相同的API在屏幕和打印設(shè)備上進(jìn)行繪圖,并且主要基于QPainter, QPaintDeviceQPaintEngine類。
QPainter用于執(zhí)行繪圖操作,QPaintDevice是一個(gè)二維空間的抽象,可以使用QPainter在其上繪制,QPaintEngine提供了QPainter用于在不同類型的設(shè)備上繪制的接口。QPaintEngine類在QPainterQPaintDevice內(nèi)部使用,并且對(duì)應(yīng)用程序程序員是隱藏的,除非他們創(chuàng)建自己的設(shè)備類型。

這種方法的主要好處是,所有的繪制都遵循相同的繪制方式,從而很容易添加對(duì)新特性的支持,并為不支持的特性提供默認(rèn)實(shí)現(xiàn)。

以下類為QPainter繪制提供了支持:


描述

QBitmap

單色(1位深度)像素圖

QBrush

定義由QPainter繪制的形狀的填充模式

QColor

基于RGB, HSV或CMYK值的顏色

QColormap

將與設(shè)備無關(guān)的QColors映射到與設(shè)備相關(guān)的像素值

QConicalGradient

與QBrush結(jié)合使用,指定錐形梯度刷

QFont

指定用于繪制文本的字體

QFontMetrics

字體度量信息

QFontMetricsF

字體度量信息

QGenericMatrix

模板類,表示有N列和M行的NxM變換矩陣

QGradient

與QBrush結(jié)合使用來指定漸變填充

QIcon

不同模式和狀態(tài)下的可伸縮圖標(biāo)

QIconEngine

QIcon渲染器的抽象基類

QImage

獨(dú)立于硬件的圖像表示,允許直接訪問像素?cái)?shù)據(jù),并且可以用作繪畫設(shè)備

QImageReader

格式獨(dú)立的接口,讀取圖像從文件或其他設(shè)備

QImageWriter

用于將圖像寫入文件或其他設(shè)備的格式獨(dú)立接口

QLine

二維矢量采用整數(shù)精度

QLineF

二維矢量使用浮點(diǎn)精度

QLinearGradient

與QBrush結(jié)合使用,指定線性梯度刷

QMargins

定義矩形的四個(gè)邊距

QMarginsF

定義矩形的四個(gè)邊距

QPagedPaintDevice

表示支持多個(gè)頁面的繪圖設(shè)備

QPaintDevice

可以用QPainter繪制的對(duì)象的基類

QPaintEngine

QPainter如何在給定平臺(tái)上繪制給定設(shè)備的抽象定義

QPainter

在小部件和其他繪制設(shè)備上執(zhí)行低級(jí)繪制

QPainterPath

用于繪制操作的容器,使圖形形狀能夠被構(gòu)造和重用

QPainterPathStroker

用于為給定的畫家路徑生成可填充的輪廓

QPdfWriter

類生成可用作繪圖設(shè)備的pdf

QPen

定義QPainter應(yīng)該如何繪制形狀的線條和輪廓

QPixmap

可以用作繪畫設(shè)備的屏幕外圖像表示

QPlatformFontDatabase

可以自定義字體的發(fā)現(xiàn)方式和呈現(xiàn)方式

QPoint

使用整數(shù)精度在平面上定義一個(gè)點(diǎn)

QPointF

使用浮點(diǎn)精度在平面上定義一個(gè)點(diǎn)

QPolygon

向量點(diǎn)使用整數(shù)精度

QPolygonF

向量點(diǎn)使用浮點(diǎn)精度

QRadialGradient

與QBrush結(jié)合使用,指定徑向梯度刷

QRect

使用整數(shù)精度在平面上定義一個(gè)矩形

QRectF

使用浮點(diǎn)精度在平面中定義一個(gè)矩形

QRegion

指定繪圖器的剪輯區(qū)域

QSize

使用整數(shù)點(diǎn)精度定義二維對(duì)象的大小

QSizeF

使用浮點(diǎn)精度定義二維對(duì)象的大小

QStylePainter

用于在小部件內(nèi)繪制QStyle元素的方便類

QSupportedWritingSystems

在使用內(nèi)部Qt字體數(shù)據(jù)庫注冊(cè)字體時(shí)使用

QSvgGenerator

用于創(chuàng)建SVG繪圖的繪圖設(shè)備

QSvgRenderer

用于將SVG文件的內(nèi)容繪制到繪圖設(shè)備上

QSvgWidget

小部件,用于顯示可縮放矢量圖形(SVG)文件的內(nèi)容

QTransform

指定坐標(biāo)系統(tǒng)的2D轉(zhuǎn)換

QVector2D

表示二維空間中的向量或頂點(diǎn)

創(chuàng)建繪畫設(shè)備

QPaintDevice類是可以繪制對(duì)象的基類,也就是說,QPainter可以在任何QPaintDevice子類上繪制。QPaintDevice的繪圖功能是由QWidgetQImageQPixmapQPictureQPrinterQOpenGLPaintDevice實(shí)現(xiàn)的。

Widget

QWidget類是Qt Widgets模塊中用戶界面元素的基類。它接收來自窗口系統(tǒng)的鼠標(biāo)、鍵盤和其他事件,并在屏幕上描繪自己的表示。

Image

QImage類提供了一個(gè)獨(dú)立于硬件的圖像表示,它是為I/O和直接的像素訪問和操作而設(shè)計(jì)和優(yōu)化的。QImage支持多種圖像格式,包括單色,8位,32位和alpha混合圖像。
使用QImage作為繪圖設(shè)備的一個(gè)優(yōu)點(diǎn)是,它可以以與平臺(tái)無關(guān)的方式保證任何繪圖操作的像素準(zhǔn)確性。另一個(gè)好處是,繪制可以在當(dāng)前GUI線程之外的另一個(gè)線程中執(zhí)行。

Pixmap

QPixmap類是一個(gè)屏幕外的圖像表示,它被設(shè)計(jì)和優(yōu)化為在屏幕上顯示圖像。與QImage不同,像素圖中的像素?cái)?shù)據(jù)是內(nèi)部的,由底層窗口系統(tǒng)管理,即像素只能通過QPainter函數(shù)或?qū)?code style="background-color: rgb(231, 243, 237); padding: 1px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px; display: inline-block;">QPixmap轉(zhuǎn)換為QImage來訪問。
為了使用QPixmap優(yōu)化繪圖,Qt提供了QPixmapCache類,它可以用于存儲(chǔ)生成昂貴的臨時(shí)像素圖,而不會(huì)使用超過緩存限制的存儲(chǔ)空間。
Qt還提供了QBitmap便利類,繼承了QPixmapQBitmap保證單色(1位深度)像素圖,主要用于創(chuàng)建自定義QCursorQBrush對(duì)象,構(gòu)造QRegion對(duì)象。

OpenGL繪制設(shè)備

如前所述,Qt提供了一些類,使在Qt應(yīng)用程序中使用OpenGL變得很容易。例如,QOpenGLPaintDevice啟用OpenGL API來Picture
QPicture類是一個(gè)記錄和回放QPainter命令的繪圖設(shè)備。圖片以平臺(tái)無關(guān)的格式將畫工命令序列化到IO設(shè)備。QPicture也是獨(dú)立于分辨率的,即一個(gè)QPicture可以顯示在不同的設(shè)備上(例如svg, pdf, ps,打印機(jī)和屏幕),看起來是一樣的。
Qt提供了QPicture::load()QPicture::save()函數(shù)以及用于加載和保存圖片的流操作符。

Custom Backends

可以通過派生QPaintDevice類并重新實(shí)現(xiàn)虛擬QPaintDevice:: paintenengine()函數(shù)來實(shí)現(xiàn)對(duì)新后端的支持,以告訴QPainter應(yīng)該使用哪個(gè)繪制引擎在這個(gè)特定的設(shè)備上繪制。要真正能夠在設(shè)備上繪圖,這個(gè)繪圖引擎必須是從qpaintenengine類派生出來的自定義繪圖引擎。

繪制

QPainter提供了高度優(yōu)化的功能,以完成大多數(shù)繪圖GUI程序所需的功能。它可以繪制從簡單的圖形基元(由QPoint, QLine, QRect, QRegion和QPolygon類表示)到復(fù)雜形狀(如矢量路徑)的一切。在Qt矢量路徑是由QPainterPath類表示的。QPainterPath為繪制操作提供了一個(gè)容器,使圖形形狀能夠被構(gòu)造和重用。

QPainterPath

painter路徑是由線條和曲線組成的對(duì)象。例如,矩形由直線組成,橢圓由曲線組成。
與普通繪圖操作相比,繪制路徑的主要優(yōu)勢(shì)在于,復(fù)雜的形狀只需要?jiǎng)?chuàng)建一次;然后只需調(diào)用QPainter::drawPath()函數(shù)就可以多次繪制它們。
QPainterPath對(duì)象可用于填充、勾勒和裁剪。要為給定的painter路徑生成可填充的輪廓,可以使用QPainterPathStroker類。
線條和輪廓是使用QPen類繪制的。pen由其樣式(即線條類型)、寬度、筆刷、如何繪制端點(diǎn)(cap-style)以及如何繪制兩條連接線之間的連接(join-style)來定義。pen的筆刷是一個(gè)QBrush對(duì)象,用來填充pen生成的筆畫,也就是說,QBrush類定義了填充模式。
QPainter還可以繪制對(duì)齊的文本和像素圖。
繪制文本時(shí),使用QFont類指定字體。Qt將使用具有指定屬性的字體,或者如果沒有匹配的字體存在,Qt將使用最接近匹配的已安裝字體。實(shí)際使用的字體屬性可以使用QFontInfo類檢索。此外,QFontMetrics類提供字體度量,QFontDatabase類提供有關(guān)底層窗口系統(tǒng)中可用字體的信息。
通常,QPainter在“自然”坐標(biāo)系中繪制,但它能夠使用QTransform類執(zhí)行視圖和世界坐標(biāo)系轉(zhuǎn)換。

反鋸齒繪制

繪制時(shí),像素渲染由QPainter::Antialiasing渲染提示控制。QPainter::RenderHint枚舉用于指定QPainter的標(biāo)志,這些標(biāo)志可能被任何給定的引擎尊重,也可能不被尊重。
QPainter::Antialiasing值表示引擎應(yīng)該盡可能地消除原語的邊緣,即通過使用不同的顏色強(qiáng)度平滑邊緣。

基本圖形繪制、填充

繪制線

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawLine(50, 50, 100, 150);
}

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_qt


或者,創(chuàng)建時(shí)不指定繪制設(shè)備,在begin()函數(shù)中設(shè)置,end時(shí)結(jié)束繪制。

QPainter p;
    p.begin(this);
    p.drawLine(50, 50, 100, 150);
    p.end();

繪制圓弧 繪制由給定矩形、startAngle和spanAngle定義的圓弧。
起始角和伸縮角必須以1/16度指定,即一個(gè)完整的圓等于5760(16 * 360)。角度的正值表示逆時(shí)針方向,負(fù)值表示順時(shí)針方向。零度在3點(diǎn)鐘方位。

QPainter p;
    p.begin(this);
    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;
    p.drawArc(rectangle, startAngle, spanAngle);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_Qt_02


繪制弦 繪制由給定矩形、startAngle和spanAngle定義的弦。弦被當(dāng)前的筆刷()填充。

起始角和伸縮角必須以1/16度指定,即一個(gè)完整的圓等于5760(16 * 360)。角度的正值表示逆時(shí)針方向,負(fù)值表示順時(shí)針方向。零度在3點(diǎn)鐘方位。

QPainter p;
    p.begin(this);
    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;
    p.drawChord(rectangle, startAngle, spanAngle);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_開發(fā)語言_03


繪制凸多邊形

QPainter p;
    p.begin(this);
    static const QPointF points[4] = {
        QPointF(40.0, 110.0),
        QPointF(50.0, 40.0),
        QPointF(110.0, 70.0),
        QPointF(120.0, 100.0)
    };
    p.drawConvexPolygon(points, 4);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_Qt_04


繪制橢圓

QPainter p;
    p.begin(this);
    QRectF rectangle(100.0, 50.0, 80.0, 60.0);

    p.drawEllipse(rectangle);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_浮點(diǎn)_05


如果寬,高一樣,就是圓。

繪制扇形

QPainter p;
    p.begin(this);
    QRectF rectangle(100.0, 50.0, 160.0, 120.0);
    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;

    p.drawPie(rectangle, startAngle, spanAngle);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_開發(fā)語言_06

填充

除此之外,還可以使用畫筆及畫刷進(jìn)行繪制和填充
繪制多邊形

QPainter p;
    p.begin(this);
    QPen pen(QBrush(Qt::gray), 2, Qt::DashLine, Qt::FlatCap, Qt::RoundJoin);
    p.setPen(pen);

    p.setBrush(Qt::green);

    static const QPointF points[4] = {
        QPointF(40.0, 110.0),
        QPointF(50.0, 40.0),
        QPointF(110.0, 70.0),
        QPointF(120.0, 100.0)
    };
    p.drawPolygon(points, 4);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_二維_07


繪制圓角矩形

QPainter p;
    p.begin(this);
    QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);
    p.setPen(pen);

    p.setBrush(Qt::lightGray);

    QRectF rectangle(10.0, 20.0, 80.0, 60.0);

    p.drawRoundedRect(rectangle, 20.0, 15.0);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_開發(fā)語言_08

漸變填充

使用畫刷還可以進(jìn)行漸變填充。
漸變有三種:

  • 線性漸變:QLinearGradient
  • 輻射漸變:QRadialGradient
  • 錐形漸變:QConicalGradient

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_Qt_09


繪制矩形

QPainter p;
    p.begin(this);
    QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);
    p.setPen(pen);

    QLinearGradient linearGrad(QPointF(100, 100), QPointF(200, 200));
    linearGrad.setColorAt(0, Qt::black);
    linearGrad.setColorAt(1, Qt::white);
    p.setBrush(linearGrad);

    QRectF rectangle(100.0, 100.0, 100.0, 100.0);

    p.drawRoundedRect(rectangle, 20.0, 15.0);
    p.end();

【Qt開發(fā)流程】之2D繪圖1:概述及基本繪制與填充和漸變填充_Qt_10

結(jié)論

人生就是這樣,有歡笑也有淚水。一部分人主要負(fù)責(zé)歡笑,另一部分人主要負(fù)責(zé)淚水


聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評(píng)論
更多 網(wǎng)友評(píng)論0 條評(píng)論)
暫無評(píng)論

返回頂部

主站蜘蛛池模板: 最近韩国电影免费观看完整版中文| 久久免费观看国产精品88av| 99久久精品午夜一区二区| 亚洲制服欧美自拍另类| 欧美电影院一区二区三区| 在线观看国产剧情麻豆精品| 国产在线视频色综合| 亚洲美女黄视频| free性俄罗斯| 激情伊人五月天久久综合| 在线免费不卡视频| 午夜天堂精品久久久久| 亚洲av无码一区二区乱子伦as| 高清永久免费观看| 最近中文字幕2018| 在线你懂的网站| 亚洲欧美日韩在线| 美女无遮挡拍拍拍免费视频| 校园亚洲春色另类小说合集| 在线a免费观看最新网站| 亚洲欧美日韩中文字幕在线一 | 又黄又爽一线毛片免费观看| 九九综合VA免费看| 91嫩草私人成人亚洲影院| 欧美激情第一区| 国产精品一区二区综合| 久精品在线观看| 超清高清欧美videos| 机机对机机120分免费无遮挡| 国产成人精品免费视频大全五级| 久久婷婷人人澡人人喊人人爽| 99久久免费精品国产72精品九九| 欧美黑人巨大videos在线| 国产精品久久一区二区三区| 久久精品人人爽人人爽快| 色婷婷在线视频| 奶大灬舒服灬太大了一进一出| 国产a不卡片精品免费观看| 亚洲国产成a人v在线| 黑人极品videos精品欧美裸| 无翼日本全彩漫画大全全彩|