Qt開發技術:Qt繪圖系統(二)QPainter詳解

若該文爲原創文章,未經允許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105506028
各位讀者,知識無窮而人力有窮,要麼改需求,要麼找專業人士,要麼自己研究

目錄

前話

繪圖:QPainter類

概述

設置屬性

繪製

繪製基礎

文字:drawText

點:drawPoint,drawPoints

直線:drawLine,drawLines

折線:drawPolyline

多邊形:drawPolygon

矩形:drawRect,drawRects

圓角矩形:drawRoundRect,drawRoundedRect

橢圓:drawEllipse

弧:drawArc

弦:drawChord

餅圖:drawPie

路徑:drawPath

圖片:drawPixmap,drawImage,drawPicture

繪製像素圖和圖像

繪製像素地圖和圖像的高分辨率版本

渲染質量

座標變換

剪切

合成模式

性能

枚舉詳解

圖像混合模式枚舉:enum QPainter::CompositionMode

像素透明枚舉:enum QPainter::PixmapFragmentHint、flags QPainter::PixmapFragmentHints

渲染枚舉:enum QPainter::RenderHint、flags QPainter::RenderHints


Qt開發專欄:開發技術(點擊傳送門)

Qt開發技術:Qt繪圖系統(一)繪圖系統介紹

Qt開發技術:Qt繪圖系統(二)QPainter詳解

 

    Qt開發技術:Qt繪圖系統(二)QPainter詳解

 

前話

      紅胖子,來也!

      Qt的圖形繪製系統,本篇主要介紹繪圖類QPainter。

 

繪圖:QPainter類

概述

QPainter類在窗口和其他繪製設備上執行低級繪製。

QPainter提供高度優化的功能來完成大多數圖形用戶界面程序所需的工作。它能畫出從簡單線條到複雜形狀如餅圖和絃等一切圖形。它還可以繪製對齊的文本和像素圖。通常,它繪製一個“自然”座標系,但它也可以進行視圖和世界變換。QPainter可以對繼承QPaintDevice類的任何對象進行操作。

QPainter的常見用法是在窗口的繪製事件中:構造和自定義(例如設置筆或畫筆)繪製器。然後畫。記住在繪製後銷燬QPainer對象。例如:

QPainter的核心功能是繪圖,但是類還提供了幾個功能,允許您自定義QPainter的設置及其渲染質量,以及其他啓用剪輯的功能。此外,還可以通過指定繪製者的合成模式來控制不同形狀合併在一起的方式。

函數QPainter::isActive()的作用是:指示繪製程序是否處於活動狀態。painter由begin()函數和接受QPaintDevice參數的構造函數激活,end()函數和析構函數將停用它。

與QPaintDevice和QPaintEngine類一起,QPainter構成了qt繪圖系統的基礎。QPainter是用於執行繪圖操作的類。QPaintDevice表示可以使用QPainter繪製的設備。QPaintEngine提供了一個接口,繪圖使用它來繪製不同類型的設備。如果繪圖處於活動狀態,則device()返回及繪圖在其上進行繪圖的繪圖設備,paintEngine()返回繪圖當前正在使用的繪圖引擎。有關詳細信息,請參見繪圖系統。

有時,要求在不通用的設備上作畫。QPainer支持一個靜態函數來執行此操作,setRedirected()。

警告:當paintdevice是一個窗口時,QPainter只能在paintEvent()函數或paintEvent()調用的函數中使用。

設置屬性

可以根據自己的喜好自定義多個設置以使QPainer繪製:

  • font()用於繪製文本的字體。如果painter爲isActive(),則可以分別使用fontInfo()和fontMetrics()函數檢索有關當前設置的字體及其度量的信息。
  • brush()定義用於填充形狀的顏色或圖案。
  • pen()定義用於繪製線條或邊界的顏色或點畫。
  • backgroundMode()定義是否有background(),即它是Qt::OpaqueMode或Qt::TransparentMode。
  • background()是Qt::OpaqueMode,pen()是點畫時,background()才適用。在這種情況下,它描述點畫中背景像素的顏色。
  • brushOrigin()定義平鋪畫筆的原點,通常是小部件背景的原點。
  • viewport()、window()、worldTransform()構成了painter的座標轉換系統。有關詳細信息,請參見“座標變換”部分和座標系文檔。
  • hasClipping()告訴畫師是否剪輯。(繪製設備也會被保存)如果painter被截取,它會被保存到clipRegion()。
  • layoutDirection()定義繪製文本時畫家使用的佈局方向。
  • worldMatrixEnabled()指示是否啓用世界轉換。
  • viewTransformEnabled()指示是否啓用視圖轉換。

請注意,這些設置中的一些反映了某些繪製設備中的設置,例如QWidget::Font()QPainter::begin()函數(或等效的QPainter構造函數)從繪製設備複製這些屬性。

可以隨時通過調用save()函數來保存QPainer的狀態,該函數將所有可用的設置保存在一個內部堆棧上(入棧)。restore()函數的作用是:將它們恢復(出棧)。

繪製

QPainter提供了繪製大多數基本體的函數:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConverExpolygon()drawCubicBezier()。drawRects()drawLines()這兩個函數使用當前的畫筆在給定的QRects或QLines數組中繪製給定數量的矩形或線條。

QPainer類還提供了fillRect()函數,該函數用給定的QBrush填充給定的QRect,以及擦除給定矩形內區域的eraseRect()函數。

所有這些函數都有整數和浮點版本(推薦使用浮點數版本)。

繪製基礎

      測試對象爲QWidget,重載paintEvent函數繪製,如下圖:

文字:drawText

void Widget::drawText(QPainter *painter)
{
    painter->save();
    painter->drawText(rect(), Qt::AlignCenter, "Hello Qt!!!");
    painter->restore();
}

點:drawPoint,drawPoints

void Widget::drawPoint(QPainter *painter)
{
    painter->save();
    painter->drawPoint(10, 10);
    QPoint point(20, 20);
    painter->drawPoint(point);
    QPointF pointF(30, 30);
    painter->drawPoint(pointF);
    painter->restore();
}

void Widget::drawPoints(QPainter *painter)
{
    painter->save();
    QPoint point[5];
    point[0].setX(10);
    point[0].setY(10);
    point[1].setX(20);
    point[1].setY(20);
    point[2].setX(30);
    point[2].setY(30);
    point[3].setX(40);
    point[3].setY(40);
    point[4].setX(50);
    point[4].setY(50);
    painter->drawPoints(point, 5);

    QPolygon polypon;
    polypon << QPoint(10, 70);
    polypon << QPoint(20, 70);
    polypon << QPoint(30, 70);
    polypon << QPoint(40, 70);
    polypon << QPoint(50, 70);
    polypon << QPoint(60, 70);
    painter->drawPoints(polypon);

    painter->restore();
}

直線:drawLine,drawLines

void Widget::drawLine(QPainter *painter)
{
    painter->save();
    QLine line(0, 0, 100, 100);
    painter->drawLine(line);
    painter->drawLine(0,100, 100, 0);
    painter->drawLine(QPoint(50, 0), QPoint(50, 100));
    painter->restore();
}

 
void Widget::drawLines(QPainter *painter)
{
    QVector<QLine> vectorLine;
    vectorLine << QLine(10, 0, 10, 100);
    vectorLine << QLine(30, 0, 30, 100);
    vectorLine << QLine(50, 0, 50, 100);
    vectorLine << QLine(70, 0, 70, 100);
    vectorLine << QLine(90, 0, 90, 100);
    painter->drawLines(vectorLine);
}

折線:drawPolyline

void Widget::drawPolyline(QPainter *painter)
{
    painter->save();
    QPoint point[5];
    point[0].setX(10);
    point[0].setY(10);
    point[1].setX(20);
    point[1].setY(10);
    point[2].setX(40);
    point[2].setY(40);
    point[3].setX(40);
    point[3].setY(60);
    point[4].setX(50);
    point[4].setY(50);
    painter->drawPolyline(point, 5);
    QPolygon polypon;
    polypon << QPoint(10, 70);
    polypon << QPoint(20, 70);
    polypon << QPoint(30, 70);
    polypon << QPoint(40, 70);
    polypon << QPoint(50, 70);
    polypon << QPoint(60, 90);
    painter->drawPolyline(polypon);
    painter->restore();
}

多邊形:drawPolygon

void Widget::drawPolygon(QPainter *painter)
{
    painter->save();
    QPoint point[5];
    point[0].setX(10);
    point[0].setY(10);
    point[1].setX(20);
    point[1].setY(10);
    point[2].setX(40);
    point[2].setY(40);
    point[3].setX(40);
    point[3].setY(60);
    point[4].setX(50);
    point[4].setY(50);
    // Qt::OddEvenFill
    // 指定使用奇數-偶數填充規則填充區域。根據此規則,
    // 我們使用以下方法確定點是否在形狀內。
    // 從點到形狀外的位置繪製一條水平線,並計算相交的數目。
    // 如果交點的數目是奇數,則該點位於形狀內部。此模式爲默認模式
    // Qt::WindingFill
    // 指定使用非零纏繞規則填充區域。根據此規則,
    // 我們使用以下方法確定點是否在形狀內。
    // 從點到形狀外部的位置繪製一條水平線。確定每個交叉點的直線方向向上還是向下。
    // 繞組數是通過求和每個交叉點的方向來確定的。如果數字不是零,則點在形狀內。
    // 這種填充模式在大多數情況下也可以被視爲閉合形狀的交點。
    painter->drawPolygon(point, 5, Qt::OddEvenFill);
//    painter->drawPolygon(point, 5, Qt::WindingFill);
    painter->restore();
}

矩形:drawRect,drawRects

void Widget::drawRect(QPainter *painter)
{
    painter->save();
    painter->drawRect(10, 10, 40, 40);
    QRect rect;
    rect.setX(50);
    rect.setY(50);
    rect.setWidth(10);
    rect.setHeight(10);
    painter->drawRect(rect);
    painter->restore();
}

void Widget::drawRects(QPainter *painter)
{
    painter->save();
    QRect rect[2];
    rect[0].setX(10);
    rect[0].setY(10);
    rect[0].setWidth(10);
    rect[0].setHeight(10);
    rect[1].setX(40);
    rect[1].setY(40);
    rect[1].setWidth(10);
    rect[1].setHeight(10);
    painter->drawRects(rect, 2);
    painter->restore();
}

圓角矩形:drawRoundRect,drawRoundedRect

void Widget::drawRoundRect(QPainter *painter)
{
    painter->save();
    painter->drawRoundRect(20, 20, 20, 20, 100, 100);  // 後兩個參數爲百分比
    painter->drawRoundedRect(50, 50, 20, 20, 10, 5);
    painter->restore();
}

橢圓:drawEllipse

void Widget::drawEllipse(QPainter *painter)
{
    painter->save();
    painter->drawEllipse(0, 0, 100, 100);
    painter->drawEllipse(50, 50, 20, 40);
    painter->restore();
}

弧:drawArc

void Widget::drawArc(QPainter *painter)
{
    painter->save();
    painter->drawArc(0, 0, 100, 100, 0 * 16, 270 * 16);
    painter->drawArc(20, 20, 60, 60, 270 * 16, 90 * 16);
    painter->restore();
}

弦:drawChord

void Widget::drawChord(QPainter *painter)
{
    painter->save();
    painter->drawChord(0, 0, 100, 100, 0 * 16, 270 * 16);
    painter->drawChord(20, 20, 60, 60, 270 * 16, 90 * 16);
    painter->restore();
}

餅圖:drawPie

void Widget::drawPie(QPainter *painter)
{
    painter->save();
    painter->drawPie(0, 0, 100, 100, 0 * 16, 270 * 16);
    painter->drawPie(20, 20, 60, 60, 270 * 16, 90 * 16);
    painter->restore();
}

路徑:drawPath

void Widget::drawPath(QPainter *painter)
{
    painter->save();
    QPainterPath painterPath;
    painterPath.addRect(10, 10, 80, 80);
    painterPath.addEllipse(QRect(20, 20, 60, 60));
    painterPath.addRegion(QRegion(30, 30, 40, 40, QRegion::Ellipse));
    painter->drawPath(painterPath);
    painter->restore();
}

圖片:drawPixmap,drawImage,drawPicture

void Widget::drawPixmap(QPainter *painter)
{
    painter->save();
    QPixmap pixmap;
    pixmap.load("D:/1.bmp");
    painter->drawPixmap(0, 0, 20, 20, pixmap);
    QImage image;
    image.load("D:/1.bmp");
    painter->drawImage(30, 30, image);
    painter->restore();
}

繪製像素圖和圖像

有繪製pixmap/image的函數,即drawPixma()drawImage()drawTiledPixmap()drawPixmap()drawImage()都會產生相同的結果,只是drawPixmap()在屏幕上更快而在QPrinter或其他設備上drawImage()可能更快。

有一個drawPicture()函數可以繪製整個QPicture的內容。drawPicture()函數是唯一一個忽略所有繪製設置的函數,因爲QPicture有自己的設置。

繪製像素地圖和圖像的高分辨率版本

高分辨率版本的像素映射的設備像素比值大於1(請參見QImageReader,QPixmap::devicePixelRotio())。如果它與基礎QPaintDevice的值匹配,則直接將其繪製到設備上,而不應用其他轉換。

例如,在高dpi屏幕上繪製64x64像素大小的QPixmap(設備像素比爲2)時,設備像素比也爲2。請注意,pixmap在用戶空間中有效地爲32x32像素。qt中基於pixmap大小計算佈局幾何圖形的代碼路徑將使用此大小。這樣做的效果是,像素地圖顯示爲高dpi像素地圖,而不是大像素地圖。

渲染質量

要使用QPainter獲得最佳渲染結果,應使用平臺獨立的QImage作爲繪製設備;即使用QImage將確保結果在任何平臺上具有相同的像素表示。

QPainter類還通過其RenderHint枚舉和對浮點精度的支持提供了一種控制渲染質量的方法:用於繪製原語的所有函數都具有浮點版本。這些通常與QPainer::Antialiasing渲染結合使用。

抗鋸齒是QPainter的渲染默認參數之一。QPainter::RenderHints用於向QPainter指定任何給定引擎可能遵守或不遵守的標誌。QPainter::Antialising表示引擎應該儘可能消除原語邊緣的混疊,即在原語邊緣周圍放置額外的像素以平滑邊緣。

浮點精度和整數精度之間的差異是一個精度問題,並且在應用程序的主窗口中可見:即使計算圓的幾何圖形的邏輯是相同的,但浮點確保每個圓之間的空白大小相同,而整數使兩個和兩個圓成爲假裝他們屬於一起。原因是基於整數的精度依賴於非整數計算的舍入。

RenderHint枚舉指定任何給定引擎可能遵守或不遵守的QPainer標誌。

  • QPainter::Antialiasing表示引擎應該儘可能地消除原語邊緣的鋸齒
  • QPainter::TextAntialiasing表示引擎應該儘可能地消除文本的鋸齒
  • QPainter::SmoothPixMapTransform表示引擎應該使用平滑的pixmap轉換算法。

renderHints() 函數的作用是:返回一個標誌,用於指定爲此繪製程序設置的渲染參數美劇。使用setRenderHint()函數設置或清除當前設置的RenderHints。

座標變換

通常,QPainter在設備自己的座標系統(通常是像素)上工作,但QPainter對座標轉換有很好的支持。

最常用的轉換是縮放、旋轉、平移和剪切。使用scale()函數按給定的偏移量縮放座標系,使用rotate()函數順時針旋轉座標系,使用translate()將座標系平移(即向點添加給定的偏移量)。還可以使用shear()函數圍繞原點扭曲座標系。有關剪切座標系的可視化,請參見仿射變換示例。

所有變換操作都在轉換worldTransform()上操作。矩陣將平面中的一個點轉換爲另一個點。有關轉換矩陣的詳細信息,請參見座標系和QTransform文檔。

setWorldTransform()函數的作用是:替換或添加到當前設置的worldTransform()resetTransform()函數的作用是:重置使用translate()、scale()、shear()、rotate()、setworldTransform()、setviewport()和setwindow()函數進行的任何轉換。deviceTransform()返回從邏輯座標轉換爲平臺相關繪製設備的設備座標的矩陣。只有在依賴於平臺的句柄上使用平臺繪製命令時才需要後一個函數,並且平臺不會自然地進行轉換。

使用QPainer繪製時,我們使用邏輯座標指定點,然後將邏輯座標轉換爲繪製設備的物理座標。邏輯座標到物理座標的映射由QPainer的combinedTransform()viewport()window()以及worldTransform()的組合處理。viewport()表示指定任意矩形的物理座標,window()以邏輯座標描述相同的矩形,worldTransform()與轉換矩陣相同。

剪切

剪切的作用是通過對元素進行剪切來控制元素的可顯示區域,也就是在 clip 指定的範圍內的內容才能顯示出來,正是使用任意形狀的 QPainterPath 作爲 QPainterclip,就能繪製出我們想要的效果,例如繪製上圖顯示的圓形和星形的圖片。

QPainer可以將任何繪圖操作剪切到矩形、區域或矢量路徑。當前剪輯可以使用函數clipRegion()和clipPath())。路徑或區域是否首選(更快),取決於基礎paintEngine()。例如,QImage繪製引擎偏好路徑,而x11繪製引擎偏好區域。設置剪輯是在畫圖的邏輯座標中完成的。

QPainter剪切後,繪製設備也可以被剪切。例如,大多數窗口會剪切掉子窗口使用的像素,而大多數打印機會剪切掉靠近紙張邊緣的區域。clipRegion()或hasClipping()的返回值不反映此附加剪切。

合成模式

QPainer提供了QPainter::CompositionMode枚舉,它定義了數字圖像合成的Porter-Duff規則;它描述了一個模型,用於將一個圖像中的像素、源、另一個圖像中的像素、目標組合在一起。

兩種最常見的組合形式是Source和SourceOver。Source用於將不透明對象繪製到繪製設備上。在此模式下,源中的每個像素都將替換目標中的相應像素。在SourceOver合成模式中,源對象是透明的,並繪製在目標的頂部。

請注意,組合轉換操作pixelwise。因此,使用圖形基元本身和其邊界矩形之間存在差異:邊界矩形包含alpha==0的像素(即基元周圍的像素)。這些像素將覆蓋另一個圖像的像素,有效地清除這些像素,而Source只覆蓋其自身的區域。

性能

QPainter是一個豐富的框架,它允許開發人員進行各種各樣的圖形操作,如漸變、合成模式和矢量圖形。而QPainer可以跨各種不同的硬件和軟件堆棧執行此操作。當然,硬件和軟件的底層組合對性能有一定的影響,並且由於排列的數量多,確保每個操作與所有組合模式、畫筆、剪切、轉換等的各種組合結合起來都很快就接近一個不可能完成的任務。作爲一個折衷方案,我們選擇了QPainer API和後端的一個子集,在這裏,性能可以保證在給定的硬件和軟件組合下儘可能好地得到它。

作爲高性能引擎,我們關注的後端是:

  • 光柵-此後端在純軟件中實現所有渲染,並始終用於渲染爲QImages。要獲得最佳性能,請僅使用格式類型QImage::Format_ARGB32_Premultipled、QImage::Format_AGB32或QImage::Format_RGB16任何其他格式(包括QImage::Format_ARGB32)的性能都明顯較差。此引擎默認用於QWidget和QPixmap。
  • OpenGL2.0(es)-這個後端是硬件加速圖形的主要後端。它可以在支持OpenGL 2.0或OpenGL/ES 2.0規範的臺式機和嵌入式設備上運行。這包括過去幾年生產的大多數圖形芯片。可以通過在QOpenGLWidget上使用QPainer來啓用引擎。

這些操作包括:

  • 簡單的轉換,意味着平移和縮放,加上0、90、180、270度旋轉。
  • drawPixmap()結合簡單轉換和不透明度以及非平滑轉換模式(QPainter::SmoothPixMapTransform未作爲渲染提示啓用)。
  • 矩形填充有純色、雙色線性漸變和簡單轉換。
  • 矩形裁剪,具有簡單的變換和相交裁剪。
  • 合成模式QPainter::CompositionMode_Source和QPainter::CompositionMode_SourceOver。
  • 使用純色和雙色線性漸變填充圓角矩形。
  • 3x3補丁像素地圖,通過QDrawBorderPixmap。

此列表指示在性能至關重要的應用程序中安全使用哪些功能。對於某些設置,其他操作也可能很快,但在廣泛使用它們之前,建議在最終運行軟件的系統上對它們進行基準測試和驗證。也有一些情況下可以使用昂貴的操作,例如當結果緩存在QPixmap中時。

枚舉詳解

圖像混合模式枚舉:enum QPainter::CompositionMode

定義數字圖像合成支持的模式。合成模式用於指定一個圖像(源)中的像素如何與另一個圖像(目標)中的像素合併。

請注意,位光柵操作模式(用RasterOp前綴表示)僅在x11和光柵繪製引擎中支持。這意味着在Mac上使用這些模式的唯一方法是通過QImage。筆和畫筆(帶alpha組件的)不支持RasterOp表示的混合模式。此外,打開QPainer::Antialiasing渲染提示將有效地禁用RasterOp模式。

最常見的類型是SourceOver(通常稱爲alpha混合,可理解爲像素顏色通道),其中源像素在目標像素的頂部混合,這樣源的alpha組件定義像素的半透明性。

一些合成模式需要源圖像或目標圖像中的alpha通道才能產生效果。爲了獲得最佳性能,最好使用圖像格式“format_ARGB8565_Premultiplied”(A-透明,R-紅,G-綠,B-藍,8565依次代表8位、5位、6位、5位)。

當設置合成模式時,它適用於所有繪製操作器、pens、brushes、gradients和pixmap/image。

枚舉常量

描述

QPainter::CompositionMode_SourceOver

0

這是默認模式。源的alpha用於覆蓋目標上的像素

QPainter::CompositionMode_DestinationOver

1

目標的alpha用於在源像素上覆蓋源的。此模式與CompositionMode_SourceOver相反。

QPainter::CompositionMode_Clear

2

目標中的像素被清除(設置爲完全透明),與源無關。

QPainter::CompositionMode_Source

3

輸出是源像素。(這意味着基本的複製操作,並且在源像素不透明時與SourceOver相同)。

QPainter::CompositionMode_Destination

4

輸出是目標像素。這意味着混合沒有效果。此模式與CompositionMode_Source相反。

QPainter::CompositionMode_SourceIn

5

輸出是源,其中alpha被目標的alpha減小。

QPainter::CompositionMode_DestinationIn

6

輸出是目標,其中alpha被源的alpha減小。此模式與CompositionMode_SourceIn相反。

QPainter::CompositionMode_SourceOut

7

輸出是源,其中alpha被目標的倒數減少。

QPainter::CompositionMode_DestinationOut

8

輸出是目的地,其中alpha被源的倒數減去。此模式與CompositionMode_SourceOut相反。

QPainter::CompositionMode_SourceAtop

9

源像素混合在目標像素上。

QPainter::CompositionMode_DestinationAtop

10

目標像素混合在源的頂部,目標像素的阿爾法被目標像素的阿爾法降低。此模式與CompositionMode_SourceAtop相反。

QPainter::CompositionMode_Xor

11

源的alpha與目標alpha的倒數相減,而目標的alpha與源alpha的倒數相減。CompositionMode_Xor與位異或不同。

QPainter::CompositionMode_Plus

12

源像素和目標像素的alpha和顏色都被添加到一起。

QPainter::CompositionMode_Multiply

13

輸出是源顏色乘以目標顏色。將顏色與白色相乘將保持顏色不變,而將顏色與黑色相乘將生成黑色。

QPainter::CompositionMode_Screen

14

源顏色和目標顏色顛倒,然後相乘。用白色屏蔽顏色會產生白色,而用黑色屏蔽顏色則不會改變顏色。

QPainter::CompositionMode_Overlay

15

根據目標顏色倍增或篩選顏色。目的地顏色與源顏色混合,以反映目的地的明暗程度。

QPainter::CompositionMode_Darken

16

選擇源顏色和目標顏色中較深的顏色。

QPainter::CompositionMode_Lighten

17

將選擇源顏色和目標顏色的淺色。

QPainter::CompositionMode_ColorDodge

18

目標顏色變亮以反映源顏色。黑色源顏色使目標顏色保持不變。

QPainter::CompositionMode_ColorBurn

19

目標顏色變暗以反映源顏色。白色源顏色保持目標顏色不變。

QPainter::CompositionMode_HardLight

20

根據源顏色倍增或篩選顏色。光源顏色將使目標顏色變亮,而暗光源顏色將使目標顏色變暗。

QPainter::CompositionMode_SoftLight

21

根據源顏色變暗或變亮顏色。類似於CompositionMode_HardLight

QPainter::CompositionMode_Difference

22

從較淺的顏色中減去較深的顏色。使用白色繪製將反轉目標顏色,而使用黑色繪製將保持目標顏色不變。

QPainter::CompositionMode_Exclusion

23

類似於合成模式的差異,但對比度較低。使用白色繪製將反轉目標顏色,而使用黑色繪製將保持目標顏色不變。

QPainter::RasterOp_SourceOrDestination

24

對源像素和目標像素(src OR dst)執行按位或運算。

QPainter::RasterOp_SourceAndDestination

25

對源像素和目標像素(src AND dst)執行按位與運算。

QPainter::RasterOp_SourceXorDestination

26

對源像素和目標像素(src XOR dst)執行逐位XOR操作。

QPainter::RasterOp_NotSourceAndNotDestination

27

對源像素和目標像素((NOT src) AND (NOT dst))執行按位運算。

QPainter::RasterOp_NotSourceOrNotDestination

28

對源像素和目標像素((NOT src) OR (NOT dst))執行逐位NAND操作。

QPainter::RasterOp_NotSourceXorDestination

29

執行一個逐位操作,其中源像素被反轉,然後與目標((NOT src) XOR dst)進行異或運算。

QPainter::RasterOp_NotSource

30

在源像素反轉的位置執行逐位操作(NOT src)。

QPainter::RasterOp_NotSourceAndDestination

31

執行一個逐位操作,其中源是反向的,然後與目標((NOT src) AND dst)一起使用。

QPainter::RasterOp_SourceAndNotDestination

32

執行一個逐位操作,其中源和“ed”使用反轉的目標像素(src AND (NOT dst)

QPainter::RasterOp_NotSourceOrDestination

33

執行一個逐位操作,其中源是反向的,然後與目標((NOT src) OR dst)一起執行或執行。

QPainter::RasterOp_SourceOrNotDestination

34

執行一個位操作,其中源是或'與倒置的目標像素(src OR (NOT dst))。

QPainter::RasterOp_ClearDestination

35

目標中的像素被清除(set to 0),與源無關。

QPainter::RasterOp_SetDestination

36

目標中的像素設置(set to 1)與源無關。

QPainter::RasterOp_NotDestination

37

執行目標像素反轉(NOT dst)的逐位操作。

像素透明枚舉:enum QPainter::PixmapFragmentHint、flags QPainter::PixmapFragmentHints

枚舉常量

描述

QPainter::OpaqueHint

0x01

指示要繪製的pixmap片段是不透明的。不透明碎片的繪製速度可能更快。

這個枚舉是在Qt4.7中引入或修改的。

PixmapFragmentHints類型是QFlags<PixmapFragmentHint>重定義的。它存儲PixmapFragmentHint值或其組合。

渲染枚舉:enum QPainter::RenderHint、flags QPainter::RenderHints

RenderInts用於向QPainer指定任何給定引擎可能遵守或不遵守的標誌。

枚舉常量

描述

QPainter::OpaqueHint

0x01

指示要繪製的pixmap片段是不透明的。不透明碎片的繪製速度可能更快。

QPainter::TextAntialiasing

0x02

指示引擎應儘可能消除文本的鋸齒。若要強制禁用文本的抗鋸齒,請不要使用此提示。相反,在字體的樣式策略上設置QFont::NoAntialias

QPainter::SmoothPixmapTransform

0x04

指示引擎應使用平滑的pixmap轉換算法(如雙線性)而不是最近鄰。

QPainter::HighQualityAntialiasing

0x08

此值已過時並將被忽略,請改用反鋸齒渲染提示。

QPainter::NonCosmeticDefaultPen

0x10

此值已過時,qpen的默認值現在爲非外觀。

QPainter::Qt4CompatiblePainting

0x20

兼容性提示,告訴引擎使用與qt 4中相同的基於x11的填充規則,其中混疊渲染的偏移量略小於半個像素。也會將默認構造的鋼筆視爲外觀筆。將Qt4應用程序移植到Qt5時可能有用。

RenderInts類型是QFlags<RenderInt>預定義類型。它存儲RenderInt值的一個或組合。

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105506028

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章