このページでは

QCanvasPainter Class

QCanvasPainter クラスは、QRhi に対してハードウェア・アクセラレーションによるペイントを行います。詳細...

ヘッダー #include <QCanvasPainter>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
以来:Qt 6.11
ステータステクニカルプレビュー

パブリックな型

enum class CompositeOperation { SourceOver, SourceAtop, DestinationOut }
enum class ImageFlag { GenerateMipmaps, RepeatX, RepeatY, Repeat, FlipY, …, NativeTexture }
flags ImageFlags
enum class LineCap { Butt, Round, Square }
enum class LineJoin { Round, Bevel, Miter }
enum class PathConnection { NotConnected, Connected }
enum class PathWinding { CounterClockWise, ClockWise }
enum class RenderHint { Antialiasing, HighQualityStroking, DisableWindingEnforce }
flags RenderHints
enum class TextAlign { Left, Right, Center, Start, End }
enum class TextBaseline { Top, Hanging, Middle, Alphabetic, Bottom }
enum class TextDirection { LeftToRight, RightToLeft, Inherit, Auto }
enum class WrapMode { NoWrap, Wrap, WordWrap, WrapAnywhere }

パブリック関数

QCanvasPainter()
~QCanvasPainter()
qsizetype activeImageCount() const
qsizetype activeImageMemoryUsage() const
QCanvasImage addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})
void addPath(const QPainterPath &path)
void addPath(const QCanvasPath &path, const QTransform &transform = QTransform())
void addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())
void arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arcTo(float x1, float y1, float x2, float y2, float radius)
void arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)
void beginHoleSubPath()
void beginPath()
void beginSolidSubPath()
void bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)
void bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)
void circle(float centerX, float centerY, float radius)
void circle(QPointF centerPoint, float radius)
void cleanupResources()
void clearRect(float x, float y, float width, float height)
void clearRect(const QRectF &rect)
void closePath()
QCanvasOffscreenCanvas createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})
void destroyCanvas(QCanvasOffscreenCanvas &canvas)
float devicePixelRatio() const
void drawBoxShadow(const QCanvasBoxShadow &shadow)
void drawImage(const QCanvasImage &image, float x, float y)
void drawImage(const QCanvasImage &image, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, float x, float y, float width, float height)
void ellipse(float centerX, float centerY, float radiusX, float radiusY)
void ellipse(const QRectF &rect)
void ellipse(QPointF centerPoint, float radiusX, float radiusY)
void fill()
void fill(const QCanvasPath &path, int pathGroup = 0)
void fillRect(float x, float y, float width, float height)
void fillRect(const QRectF &rect)
void fillText(const QString &text, float x, float y, float maxWidth = -1)
void fillText(const QString &text, const QRectF &rect)
void fillText(const QString &text, QPointF point, float maxWidth = -1)
QTransform getTransform() const
void lineTo(float x, float y)
void lineTo(QPointF point)
void moveTo(float x, float y)
void moveTo(QPointF point)
void quadraticCurveTo(float cpX, float cpY, float x, float y)
void quadraticCurveTo(QPointF controlPoint, QPointF endPoint)
void rect(float x, float y, float width, float height)
void rect(const QRectF &rect)
void removeImage(const QCanvasImage &image)
void removePathGroup(int pathGroup)
QCanvasPainter::RenderHints renderHints() const
void reset()
void resetClipping()
void resetTransform()
void restore()
void rotate(float angle)
void roundRect(float x, float y, float width, float height, float radius)
void roundRect(const QRectF &rect, float radius)
void roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void save()
void scale(float scale)
void scale(float scaleX, float scaleY)
void setAntialias(float antialias)
void setBrushTransform(const QTransform &transform)
void setClipRect(float x, float y, float width, float height)
void setClipRect(const QRectF &rect)
void setFillStyle(const QColor &color)
void setFillStyle(const QCanvasBrush &brush)
void setFont(const QFont &font)
void setGlobalAlpha(float alpha)
void setGlobalBrightness(float value)
void setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)
void setGlobalContrast(float value)
void setGlobalSaturate(float value)
void setLineCap(QCanvasPainter::LineCap cap)
void setLineJoin(QCanvasPainter::LineJoin join)
void setLineWidth(float width)
void setMiterLimit(float limit)
void setPathWinding(QCanvasPainter::PathWinding winding)
void setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)
void setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)
void setStrokeStyle(const QColor &color)
void setStrokeStyle(const QCanvasBrush &brush)
void setTextAlign(QCanvasPainter::TextAlign align)
void setTextAntialias(float antialias)
void setTextBaseline(QCanvasPainter::TextBaseline baseline)
void setTextDirection(QCanvasPainter::TextDirection direction)
void setTextLineHeight(float height)
void setTextWrapMode(QCanvasPainter::WrapMode wrapMode)
void setTransform(const QTransform &transform)
void skew(float angleX, float angleY = 0.0f)
void stroke()
void stroke(const QCanvasPath &path, int pathGroup = 0)
void strokeRect(float x, float y, float width, float height)
void strokeRect(const QRectF &rect)
QRectF textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)
QRectF textBoundingBox(const QString &text, const QRectF &rect)
QRectF textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)
void transform(const QTransform &transform)
void translate(float x, float y)
void translate(QPointF point)

静的パブリックメンバ

float mmToPx(float mm)
float ptToPx(float pt)

詳細説明

Qt Canvas Painter(QCanvasPainter)は、ハードウェアアクセラレーション(GPU)による描画に最適化された描画 API を提供します。この API は、HTML Canvas 2D Context 仕様に忠実に準拠しており、Qt C++ に移植されています。また、QPainter にも影響を受けていますが、よりコンパクトな API になっています。

以下は、QCanvasPainter を使用して丸いボタンを作成する簡単な例です。

QRectF rect(40, 70, 120, 60);
QRectF shadowRect = rect.translated(2, 4);
// Paint shadow
QCanvasBoxShadow shadow(shadowRect, 30, 15, "#60373F26");
p->drawBoxShadow(shadow);
// Paint rounded rect
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#DBEB00");
p->fill();
// Paint text
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
QFont font("Titillium Web", 18);
p->setFont(font);
p->setFillStyle("#373F26");
p->fillText("CLICK!", rect);

シンプルなグラフを描くもう一つの例です。

// Paint grid
QCanvasGridPattern grid(0, 0, 10, 10, "#404040", "#202020");
p->setFillStyle(grid);
p->fillRect(0, 0, width(), height());
// Paint axis
p->setFillStyle(QColorConstants::White);
p->fillRect(0, 0.5 * height() - 1, width(), 2);
p->fillRect(0.5 * width() - 1, 0, 2, height());
// Paint shadowed graph
p->beginPath();
p->moveTo(20, height() * 0.8);
p->bezierCurveTo(width() * 0.2, height() * 0.4,
                 width() * 0.5, height() * 0.8,
                 width() - 20, height() * 0.2);
p->setAntialias(10);
p->setLineWidth(12);
p->setStrokeStyle("#D0000000");
p->stroke();
p->setAntialias(1);
p->setLineWidth(6);
QCanvasLinearGradient lg(0, 0, 0, height());
lg.setStartColor(QColorConstants::Red);
lg.setEndColor(QColorConstants::Green);
p->setStrokeStyle(lg);
p->stroke();

機能

ほとんどの部分と命名の観点から、QCanvasPainter は HTML Canvas 2D コンテキスト (https://html.spec.whatwg.org/multipage/canvas.html#2dcontext) を忠実に踏襲しています。これにより、多くの開発者にとって使い慣れた API になり、既存の canvas コードを簡単に再利用できるようになります。しかし、HTML canvas と 100% 互換であることは目指していません。QCanvasPainter は、よりシンプルで、QRhi ハードウェア アクセラレーション グラフィックス API 上でより高いパフォーマンスを発揮し、現代の UI ニーズをより的確に満たすために、いくつかの機能を省略しています。これらの理由により、QCanvasPainter には、HTML Canvas 2D Context に比べて追加機能もあります。

これらは、HTML canvas と比較して少なくとも現在不足している機能の一部です:

  • クリッピング:クリッピングはすべて(変形された)矩形であり、パス形状へのクリッピングはサポートされていません。
  • 塗りつぶしモード:デフォルトの Non-zero fillrule のみがサポートされており、Even-odd fillrule はサポートされていません。
  • ダッシュ:破線/点線のストロークパターンはサポートされていません。
  • パスのテスト:isPointInPath() メソッドや isPointInStroke() メソッドはありません。
  • テキストのストローク:テキストのアウトライン・ストロークには対応していません。
  • フィルタ:Canvas SVG フィルタ効果はサポートされていません。
  • CompositeModes:余分なバッファにレンダリングすることなくサポートできるコンポジットモードは 3 つまでです。
  • シャドウ:組み込みのシャドウ・メソッドはサポートされていません。

一方、QCanvasPainter が HTML canvas と比較して提供する追加機能には次のようなものがあります:

  • パスグループ:QCanvasPainter では、静的なパスにペイントし、これらのパスをグループとしてキャッシュして GPU を最適に使用できます。
  • 調整可能なアンチエイリアス:パスの頂点アンチエイリアシングと SDF テキスト レンダリングにより、アンチエイリアシングのピクセル量を自由に調整して、より滑らかなペイントを実現できます。
  • ボックスグラデーション:線形、放射状、円錐状のグラデーションに加えて、QCanvasPainter は丸みを帯びた四角形のボックスグラデーションもサポートしています。
  • ボックスシャドウ:QCanvasPainter は、CSS ボックス シャドウ ブラシもサポートしています。レンダリングには、Qt Quick RectangularShadow と同様の SDF アプローチが使用されており、非常にパフォーマンスが高くなっています。
  • グリッド パターン:QCanvasPainter は、動的なグリッド パターンとバー パターンのスタイルQCanvasGridPattern をサポートしています。
  • カスタムブラシ:QCanvasPainter では、カスタム頂点シェーダおよびフラグメント シェーダを使用した塗りつぶしやストロークも可能です (QCanvasCustomBrush)。これらのカスタムブラシはテキストにも使用できます。
  • テキストの折り返し:QCanvasPainter では、テキストを複数行に自動的に折り返すことができます。
  • カラー効果:QCanvasPainter では、globalAlpha に加えて、グローバルな明るさ、コントラスト、彩度もサポートしています。
  • 色合い画像:QCanvasPainter は、ペイント画像と画像パターンの色合いをサポートします。

QCanvasPainter はアーキテクチャに依存せず、Qt QuickQt Widgets の両方のアプリケーションで使用できます。実際には、QWindowQRhi だけで、そのどちらでもなくても使用可能です。QCanvasPainterを使用するには、アプリケーションのアーキテクチャに応じて、これらのクラスのいずれかを使用してください:

塗りつぶしルール

QCanvasPainter はnonzero (WindingFill) の塗りルールを使用します。パス ポイントの方向に基づいて塗りつぶしを選択するには、setRenderHint() を使用してDisableWindingEnforce レンダリング ヒントを設定し、強制的な巻き込みを無効にします。

p->setRenderHint(QCanvasPainter::RenderHint::DisableWindingEnforce);
p->beginPath();
// Outer shape, counterclockwise
p->moveTo(20, 20);
p->lineTo(100, 180);
p->lineTo(180, 20);
p->closePath();
// Inner shape, clockwise
p->moveTo(100, 40);
p->lineTo(125, 90);
p->lineTo(75, 90);
p->closePath();
p->fill();
p->stroke();

しかし、より一般的なケースでは、setPathWinding() またはbeginHoleSubPath() とbeginSolidSubPath() ヘルパーを使用して、優先する塗りつぶしを設定します。

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
// Start painting holes
p->beginHoleSubPath();
p->roundRect(40, 40, 120, 120, 10);
// Start painting solid
p->beginSolidSubPath();
p->rect(60, 60, 80, 20);
p->circle(100, 120, 20);
p->fill();
p->stroke();

メンバ型ドキュメント

enum class QCanvasPainter::CompositeOperation

Qt Canvas Painter は 3 つの合成操作をサポートしています:

定数説明
QCanvasPainter::CompositeOperation::SourceOver0デフォルト値。既存のコンテンツの上に新しい図形を描画します。
QCanvasPainter::CompositeOperation::SourceAtop1新しい図形は、既存のコンテンツと重なる部分にのみ描画されます。
QCanvasPainter::CompositeOperation::DestinationOut2既存のコンテンツは、新しい図形と重ならないように保持されます。

setGlobalCompositeOperation()も参照してください

enum class QCanvasPainter::ImageFlag
flags QCanvasPainter::ImageFlags

この enum は、画像に関するフラグを指定します。フラグを設定するにはaddImage() を使用します。

定数説明
QCanvasPainter::ImageFlag::GenerateMipmaps1 << 0画像にミップマップを生成する場合に設定します。ミップマップは、元のサイズよりも小さいサイズに拡大縮小された画像に対して、より滑らかな出力が望まれる場合に使用されるべきです。
QCanvasPainter::ImageFlag::RepeatX1 << 1X 座標で画像を繰り返すには、画像パターンと一緒に使います。
QCanvasPainter::ImageFlag::RepeatY1 << 2Y座標で画像を繰り返すには、画像パターンと一緒に使います。
QCanvasPainter::ImageFlag::RepeatRepeatX | RepeatY両方の座標で画像を繰り返すには、画像パターンと併用します。
QCanvasPainter::ImageFlag::FlipY1 << 3レンダリング時に画像をY方向に反転させます。
QCanvasPainter::ImageFlag::Premultiplied1 << 4画像データにはあらかじめアルファが乗算されています。
QCanvasPainter::ImageFlag::Nearest1 << 5画像補間は Linear ではなく Nearest です。
QCanvasPainter::ImageFlag::NativeTexture1 << 6これはQCanvasPainter の外側のテクスチャであることを示します。

ImageFlags 型はQFlags<ImageFlag> の typedef です。これは、ImageFlag 値の OR の組み合わせを格納します。

enum class QCanvasPainter::LineCap

LineCapは、線の終端(キャップ)の描画方法を定義するために使用されます。

定数説明
QCanvasPainter::LineCap::Butt0(デフォルト) 線の終点を覆わない正方形の線の終端。
QCanvasPainter::LineCap::Round1丸い線の終端。
QCanvasPainter::LineCap::Square2終点を覆い、そこから線幅の半分だけはみ出る正方形の線端。

setLineCap()も参照

enum class QCanvasPainter::LineJoin

LineJoinは、接続された2つの線間の結合をどのように描画するかを定義するために使用されます。

定数説明
QCanvasPainter::LineJoin::Round02本の線の間の円弧は塗りつぶされます。
QCanvasPainter::LineJoin::Bevel12本の線の間の三角形の切り欠きが塗りつぶされます。
QCanvasPainter::LineJoin::Miter2(デフォルト) 線の外縁が斜めに交わるように延長され、この領域が塗りつぶされます。

setLineJoin() およびsetMiterLimit()も参照

enum class QCanvasPainter::PathConnection

いくつかの描画メソッドでは、新しいパスを前のパスの最後の点に接続するかどうかを指定するために PathConnection が使用されます。

定数説明
QCanvasPainter::PathConnection::NotConnected0前のパスの最後の点から現在のパスの最初の点まで線が引かれていない。
QCanvasPainter::PathConnection::Connected1前のパスの最後の点は、 カ レ ン ト パスの最初の点に接続 さ れます。

arc()も参照

enum class QCanvasPainter::PathWinding

PathWinding は、パスの描画方向を指定するために使用されます。この方向は、サブパスがパスの中で実線か穴かを決定するために使用されます。

定数説明
QCanvasPainter::PathWinding::CounterClockWise0(デフォルト) 立体形状の場合は反時計回りに巻きます。
QCanvasPainter::PathWinding::ClockWise1穴の場合は時計回り。

setPathWinding()も参照してください

enum class QCanvasPainter::RenderHint
flags QCanvasPainter::RenderHints

この enum は、レンダリングに関連するQCanvasPainter へのフラグを指定します。フラグを設定するにはsetRenderHint() を使用します。

定数説明
QCanvasPainter::RenderHint::Antialiasing1 << 0これを false に設定すると、アンチエイリアシングが無効になります。有効にするとレンダリングコストが高くなります。デフォルト値はtrueです。
QCanvasPainter::RenderHint::HighQualityStroking1 << 1これをtrueに設定すると、ストロークが重なり、完全な不透明度を持たないような、あまり一般的でないケースで、より正しいレンダリングが行われます。有効にするとレンダリングコストが高くなります。デフォルト値は false です。
QCanvasPainter::RenderHint::DisableWindingEnforce1 << 2これをtrueに設定すると、setPathWinding()に設定されたものと一致するようにパスを強制的に巻き取ることを無効にします。無効にすると、例えば、クロック順に点を追加してパスに穴を作ることができます。無効にすることでパフォーマンスも向上します。

RenderHints型はQFlags<RenderHint>のtypedefです。RenderHint値のORの組み合わせを格納します。

enum class QCanvasPainter::TextAlign

TextAlignは、テキストが水平方向にどのように整列されるかを定義するために使用されます。

定数説明
QCanvasPainter::TextAlign::Left0テキストの左側を指定された位置に水平に揃える。
QCanvasPainter::TextAlign::Right1テキストの右側を指定された位置に水平に揃える。
QCanvasPainter::TextAlign::Center2テキストの中央を指定された位置に水平に揃える。
QCanvasPainter::TextAlign::Start3(デ フ ォル ト ) テキス ト は、 行の通常の開始位置で揃え ら れます (左書 き ロ ケールの場合は左揃え、 右書 き ロ ケールの場合は右揃え)。
QCanvasPainter::TextAlign::End4テキス ト は通常の行末位置に揃え ら れます (左書 き ロ ケールの場合は右揃え、 右書 き ロ ケールの場合は左揃え)。

setTextAlign()、setTextDirection()、fillText()も参照のこと

enum class QCanvasPainter::TextBaseline

TextBaselineは、テキストがどのように垂直方向に整列(ベースライン)されるかを定義するために使用されます。

定数説明
QCanvasPainter::TextBaseline::Top0テキストの上端を指定された位置に垂直に揃える。
QCanvasPainter::TextBaseline::Hanging1テキストの垂れ下がったベースラインを指定された位置に垂直に揃える。
QCanvasPainter::TextBaseline::Middle2テキストの中央を、指定された位置に垂直に揃える。
QCanvasPainter::TextBaseline::Alphabetic3(デ フ ォ ル ト ) テキス ト のベース ラ イ ン を縦に、 指定 し た位置に揃える。
QCanvasPainter::TextBaseline::Bottom4テキス ト の下端を、 指定 し た位置に縦に揃える。

setTextBaseline() およびfillText()も参照

enum class QCanvasPainter::TextDirection

TextDirection は、テキストが水平方向にどのように配置されるかを定義するために使用されます。

定数説明
QCanvasPainter::TextDirection::LeftToRight0テキストの方向は左から右です。
QCanvasPainter::TextDirection::RightToLeft1テキス ト の向きは右書 き です。
QCanvasPainter::TextDirection::Inherit2(デフォルト) テキスト方向はQGuiApplication layoutDirection から継承されます。https://doc.qt.io/qt-6/qguiapplication.html#layoutDirection-prop を参照。
QCanvasPainter::TextDirection::Auto3テキス ト の向きは、 テキス ト 文字列か ら 自動的に検出 さ れます。QString::isRightToLeft() を参照。

注意 : こ れはテ キ ス ト を分析す る 必要があ る ので、 他のオプシ ョ ン よ り も 遅 く な る可能性があ り ます。

setTextDirection(),setTextAlign(),fillText()も参照

enum class QCanvasPainter::WrapMode

WrapModeは、テキストを複数行に折り返す方法を定義するために使用されます。

定数説明
QCanvasPainter::WrapMode::NoWrap0(デフォルト) 折り返しは行われません。テキストが不十分な改行を含む場合、contentWidthは設定された幅を超える。
QCanvasPainter::WrapMode::Wrap1可能であれば、折り返しは単語の境界で行われ、そうでなければ、単語の途中であっても、行の適切な位置で行われます。
QCanvasPainter::WrapMode::WordWrap2折り返しは単語境界でのみ行われます。単語が長すぎる場合、コンテンツの幅は設定された幅を超える。
QCanvasPainter::WrapMode::WrapAnywhere3折り返しは、単語の途中であっても、行のどの位置でも行われます。

setTextWrapMode() およびfillText()も参照のこと

メンバ関数ドキュメント

QCanvasPainter::QCanvasPainter()

ペインターを構築する。

[noexcept] QCanvasPainter::~QCanvasPainter()

画家を破壊する。

qsizetype QCanvasPainter::activeImageCount() const

このQCanvasPainter に登録されているアクティブなQCanvasImage オブジェクトの数を返します。これには、gradients 用に内部で作成されたイメージも含まれます。

QCanvasImage QCanvasOffscreenCanvas インスタンスや外部で管理されているテクスチャを登録して作成されたオブジェクトは、この関数では考慮されません。

activeImageMemoryUsage()、addImage()、removeImage()も参照

qsizetype QCanvasPainter::activeImageMemoryUsage() const

addImage() オーバーロードがQImage を取って作成した、このペインターのすべてのアクティブなQCanvasImage インスタンスの画像(ピクセル)データによって使用されるメモリの概算値をキロバイト単位で返します。 また、gradients の内部的に作成された画像のデータも含まれます。

QCanvasPainter は、addImage() が返った後は、CPU側のQImage データのコピーを保持しません。したがって、この関数の結果は、テクスチャに使用される GPU メモリの近似値となります。

注意: この値は、画像フォーマットと寸法に基づく推定値にすぎません。Qt は、テクスチャのデータが GPU 側のメモリにどのように保存され、どのように配置されるかを知りません。

オフスクリーンのキャンバスや、他のaddImage() オーバーロードによって登録された外部管理テクスチャは、この関数では考慮されません。

有効なQCanvasImage に対しては、sizeInBytes() を呼び出すことで、常にバイト単位の個々のサイズを問い合わせることができます。この関数は、QCanvasImageQCanvasOffscreenCanvas またはQRhiTexture から作成された場合にも有効な結果を返すが、ミップマップやマルチサンプルデータは考慮されない。

activeImageCount()、addImage()、removeImage()も参照

QCanvasImage QCanvasPainter::addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})

テクスチャとしてペインターが利用できるflagsimage を追加します。テクスチャ ID と画像に関するその他の情報とともにQCanvasImage を返します。返されたQCanvasImage は、drawImageQCanvasImagePattern とともに使用できます。このメソッドを呼び出した後、image QImage をメモリに保持する必要はありません。

同じimage で呼び出すと、キャッシュヒットが期待できるため、安価な操作になります。

最適化の際には、addImage()を一度だけ呼び出すように注意しなければならない。アプリケーションの設計によっては、それで十分とは限りません。たとえば、ウィジェットを新しいトップレベルに移動したために、ペインターが新しいQRhi に関連付けられた場合など、基礎となるグラフィックリソースが失われた場合、この関数を呼び出すことは、image からネイティブグラフィックテクスチャを再作成するために不可欠です。

drawImage() およびremoveImage()も参照してください

QCanvasImage QCanvasPainter::addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})

ペインターがテクスチャとして利用できるflagstexture を追加します。フラグNativeTexture は暗黙的に設定されます。返されたQCanvasImagedrawImageQCanvasImagePattern とともに使用できます。

注意: texture の所有権は取得されません

これはオーバーロードされた関数です。

drawImage() およびremoveImage()も参照してください

QCanvasImage QCanvasPainter::addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})

canvasflags とともにペインターに登録し、画像として利用できるようにする。返されたQCanvasImagedrawImageQCanvasImagePattern と一緒に使うことができます。

canvas つまり、removeImage() はcanvas を無効にしません。

これはオーバーロードされた関数である。

drawImage() およびremoveImage()も参照

void QCanvasPainter::addPath(const QPainterPath &path)

path を現在のパスに追加します。

注意: QCanvasPainter は WindingFill (nonzero) fillrule を使用します。これは、すべての QPainterPath が正しくレンダリングされないことを意味します。こ れは、 た と えばパスが穴のあいたテ キ ス ト キ ャ ラ ク タ を含んでい る と き に顕著です。

注意 : こ の メ ソ ッ ド は主に、QPainterQPainterPath と の互換性のために利用で き ます。QCanvasPainter メ ソ ッ ド で直接パ ス を描 く こ と と と 比較 し てパフ ォーマ ン ス を向上 さ せ る も のではあ り ません。

void QCanvasPainter::addPath(const QCanvasPath &path, const QTransform &transform = QTransform())

path をカ レ ン ト パ ス に追加 し 、 オプシ ョ ンでtransform を用いてパ ス ポ イ ン ト を変更 し ます。transform が与え ら れない と き (ま たはそれが同一行列であ る と き )、 こ の操作はパスデー タ を再利用す る ので非常に高速です。

// m_path is QCanvasPath
if (m_path.isEmpty())
    m_path.circle(60, 60, 40);
p->beginPath();
p->addPath(m_path);
p->addPath(m_path, QTransform::fromTranslate(80, 80));
p->fill();
p->stroke();

void QCanvasPainter::addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())

start のコマンドから開始し、count のコマンドの量を含めて、path を現在のパスに追加する。オプションで、transform を使ってパスポイントを変更する。startcount の範囲がチェックされ、コマンドがQCanvasPath::commandsSize() より多くアクセスされないようにする。path.positionAt(start - 1)パスが現在のパス位置から続いてはならない場合は、最初にmoveTo() を呼び出す。

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    m_path.moveTo(20, 60);
    for (int i = 1; i < 160; i++) {
        m_path.lineTo(20 + i,
                      60 + 20 * sin(0.1 * i));
    }
}
p->stroke(m_path);
p->beginPath();
p->addPath(m_path, 20, 100,
           QTransform::fromTranslate(0, 80));
p->stroke();

void QCanvasPainter::arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)

新しい円弧状のサブパスを作成する。弧の中心はcenterX,centerY,radius にあり、弧は角度a0 からa1 へ描かれ、direction (ClockWise またはCounterClockWise) で掃引される。connectionNotConnected の場合、 arc は直前のパ ス位置か ら 円弧の始点へ線を追加 し ません。角度は ラ ジ ア ン単位で指定 し ます。

p->beginPath();
p->moveTo(100, 100);
p->arc(100, 100, 80, 0, 1.5 * M_PI);
p->closePath();
p->fill();
p->stroke();

注: HTML canvas の 2D コンテキストでは、円の描画に arc() を使用しますが、QCanvasPainter では、circle() またはellipse() を使用することをお勧めします。

void QCanvasPainter::arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)

新しい円弧状のサブパスを作成する。弧の中心はcenterPoint で、radius とし、弧は角度a0 からa1 まで描かれ、direction (ClockWise またはCounterClockWise) で掃引される。connectionNotConnected の場合、 arc は直前のパ ス位置か ら弧の始点へ線を追加 し ません。角度は ラ ジ ア ン単位で指定 し ます。

注意: HTML canvas の 2D コンテキストでは、円を描くために arc() を使用しますが、QCanvasPainter では、circle() またはellipse() を使用することをお勧めします。

これはオーバーロードされた関数です。

void QCanvasPainter::arcTo(float x1, float y1, float x2, float y2, float radius)

最後のパ ス点 と 、 指定 し た 2 点 (x1,y1x2,y2 ) とradius で定義 さ れた隅に弧分点を追加 し ます。こ の円弧は、 必要に応 じ て自動的に、 パ ス の最新点に直線で接続 さ れます。

p->beginPath();
p->moveTo(20, 20);
p->arcTo(240, 20, 20, 220, 50);
p->arcTo(20, 220, 20, 20, 30);
p->stroke();

void QCanvasPainter::arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)

最後のパ ス点 と 、 指定 し た 2 点 (controlPoint1controlPoint2 ) とradius で定義 さ れた隅に弧分点を追加 し ます。こ の円弧は、 必要に応 じ て自動的に、 パスの最新点に直線で接続 さ れます。

こ れはオーバー ロー ド さ れた関数です。

void QCanvasPainter::beginHoleSubPath()

ホールサブパスを開始する。これはsetPathWinding(QCanvasPainter::PathWinding::ClockWise) と同じ。)

p->beginPath();
p->circle(100, 100, 80);
p->beginHoleSubPath();
p->rect(60, 60, 80, 80);
p->beginSolidSubPath();
p->circle(100, 100, 20);
p->fill();
p->stroke();

beginSolidSubPath()も参照のこと

void QCanvasPainter::beginPath()

現在のパスをクリアしながら、新しいパスの描画を開始する。

void QCanvasPainter::beginSolidSubPath()

ソリッドサブパスを開始する。これはsetPathWinding(QCanvasPainter::PathWinding::CounterClockWise) と同じである。)

beginHoleSubPath()も参照

void QCanvasPainter::bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)

パス内の最後の点から、2 つの制御点 (cp1X,cp1Ycp2X,cp2Y) を経由して、指定点 (x,y) までの三次ベジエセグメントを追加します。

p->beginPath();
p->moveTo(20, 20);
p->bezierCurveTo(150, 50, 50, 250, 180, 120);
p->stroke();

void QCanvasPainter::bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)

パスの最後の点から、2 つの制御点 (controlPoint1controlPoint2) を経由して、指定された点endPoint まで、3 次ベジェセグメントを追加します。

これはオーバーロードされた関数です。

void QCanvasPainter::circle(float centerX, float centerY, float radius)

radius を持つ (centerX,centerY) に新しい円形のサブパスを作成する。

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();

void QCanvasPainter::circle(QPointF centerPoint, float radius)

新しい円形のサブパスをradiuscenterPoint に作成する。

これはオーバーロードされた関数である。

void QCanvasPainter::cleanupResources()

未使用のテクスチャをキャッシュから削除するようにスケジュールします。

さらに、メモリ使用量を最小限に抑えるために、この関数を呼び出すと他のキャッシュやプールが縮小されることがあります。これにより、その後の描画呼び出しがより高価になる可能性があります。

void QCanvasPainter::clearRect(float x, float y, float width, float height)

x,y,width,height で指定された矩形を透明な黒で塗りつぶすことによって、矩形領域のピクセルを消去する。消去にはブレンドが不要なので、fillRect() よりも高速に処理できる。

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();
p->clearRect(60, 0, 80, 120);

void QCanvasPainter::clearRect(const QRectF &rect)

rect で指定した矩形を透明な黒で塗りつぶすことで、矩形領域のピクセルを消去します。これはQRectF を使ったオーバーロードされたメソッドです。

これはオーバーロードされた関数です。

void QCanvasPainter::closePath()

現在のサブパスを線分で閉じる。これはlineTo([始点]) を最後のパス要素とすることと同じです。

QCanvasOffscreenCanvas QCanvasPainter::createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})

与えられたpixelSizesampleCountflags を持つ新しいオフスクリーンキャンバスを返します。

キャンバスのサイズはピクセル単位で指定します。pixelSize,sampleCount,flags の各プロパティは、その後も不変です。異なるサイズ、サンプル数、フラグを持つキャンバスを取得するには、新しいキャンバスを作成します。

描画コマンドを使用してオフスクリーン・キャンバスをターゲットにするには、低レベルの API を使用している場合は適切なQCanvasRhiPaintDriver::beginPaint() オーバーロードを、コンビニエンス・ウィジェットやQt Quick アイテム・クラスを使用している場合はQCanvasPainterWidget::beginCanvasPainting() またはQCanvasPainterItemRenderer::beginCanvasPainting() を呼び出します。

通常、キャンバスにペイントすると、キャンバスの内容はクリアされます。これを無効にするには、flagsPreserveContents を渡します。

canvas へのマルチサンプル・レンダリング(マルチサンプル・アンチエイリアシング、MSAA)を要求するには、サンプル数を 4 や 8 など、1 より大きく設定します。ただし、マルチサンプリングが有効になっている場合、レンダーパス間でキャンバスの内容を保持することはサポートされていないため、PreserveContents フラグは機能しません。

void QCanvasPainter::destroyCanvas(QCanvasOffscreenCanvas &canvas)

canvas を支えるリソースを破壊する。canvasnull canvas になる。

ペインターは破棄時に自動的にこれを行います。したがって、この関数を呼び出す必要があるのは、関連するリソースをすぐに解放したい場合だけです。

float QCanvasPainter::devicePixelRatio() const

物理ピクセルとデバイス非依存ピクセルの比率を返す。デフォルト値は1.0 です。

void QCanvasPainter::drawBoxShadow(const QCanvasBoxShadow &shadow)

ボックスを描画するshadowshadowこのメソッドの前にbeginPath() を呼び出す必要はありません。

注意: drawBoxShadow() がカバーする領域を視覚的に確認するには、QCPAINTER_DEBUG_SHADOW_RECT 環境変数を設定します。

QRectF rect(40, 40, 120, 120);
QRectF shadowRect = rect.translated(-2, 4);
QCanvasBoxShadow shadow(shadowRect, 0, 30);
p->drawBoxShadow(shadow);
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#2CDE85");
p->fill();

QCanvasBoxShadowも参照

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y)

imagex,y にデフォルトサイズで描画する。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 36, 36);

addImage()も参照のこと

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &destinationRect)

destinationRect の位置とサイズにimage を描画する。

これはオーバーロードされた関数である。

addImage()も参照のこと

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)

画像のsourceRect 領域からdestinationRect の位置とサイズにimage を描画する。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
QRectF sourceRect(20, 30, 54, 76);
QRectF destinationRect(0, 0, 200, 200);
p->drawImage(image, sourceRect, destinationRect);

これはオーバーロードされた関数です。

addImage()も参照

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y, float width, float height)

imagex,y, 与えられたwidthheight に描画する。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 50, 0, 100, 200);

これはオーバーロードされた関数である。

addImage()も参照

void QCanvasPainter::ellipse(float centerX, float centerY, float radiusX, float radiusY)

(centerX,centerY) に、radiusXradiusY を持つ新しい楕円形のサブパスを作成する。

p->beginPath();
p->ellipse(100, 100, 80, 60);
p->fill();
p->stroke();

void QCanvasPainter::ellipse(const QRectF &rect)

rect に新しい楕円形のサブパスを作成する。この楕円はrect の領域をカバーする。

QRectF rect(40, 20, 120, 160);
p->fillRect(rect);
p->beginPath();
p->ellipse(rect);
p->stroke();

これはオーバーロードされた関数です。

void QCanvasPainter::ellipse(QPointF centerPoint, float radiusX, float radiusY)

新しい楕円形のサブパスをradiusXradiusYcenterPoint に作成する。

これはオーバーロードされた関数である。

void QCanvasPainter::fill()

現在のパスを現在の塗りつぶしスタイルで塗りつぶします。

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->fill();

setFillStyle()も参照

void QCanvasPainter::fill(const QCanvasPath &path, int pathGroup = 0)

path を現在の塗りつぶしスタイルで塗りつぶし、pathGroup に属する。QCanvasPath を通 じ て塗る こ と は、 パ ス に よ り 多 く の コ マ ン ド が含まれてお り 、 その大部分が静的であ る と き に最適です。デフォルトでは、pathGroup0 であるため、最初のグループを使用します。pathGroup-1 の場合、パスは GPU 側でキャッシュされません。パス・キャッシュ・グループの使用に関する詳細は、QCanvasPath ドキュメントを参照してください。このメソッドの前にbeginPath() を呼び出す必要はありません。

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        float w = 100 + 60 * sin(i);
        m_path.rect(100 - w * 0.5,
                    22 + i * 10,
                    w, 6);
    }
}
p->fill(m_path);

これはオーバーロードされた関数です。

setFillStyle()も参照してください

void QCanvasPainter::fillRect(float x, float y, float width, float height)

指定された位置 (x,y) に、塗りつぶされた矩形をサイズwidth,height で描画します。

注意: これは便宜上提供されている。複数の矩形を塗りつぶす場合は、rect() を使うほうがよいでしょう。

p->fillRect(20, 20, 160, 160);
// The above code does same as:
//  p->beginPath();
//  p->rect(20, 20, 160, 160);
//  p->fill();

void QCanvasPainter::fillRect(const QRectF &rect)

塗りつぶされた矩形をrect に描画する。これはQRectF を使ったオーバーロードされたメソッドです。

注意: これは便宜上提供されています。1つ以上の矩形を塗りつぶす場合は、rect() を使用することをお勧めします。

これはオーバーロードされた関数です。

void QCanvasPainter::fillText(const QString &text, float x, float y, float maxWidth = -1)

text 文字列を、 現在の textAlign と textBaseline で、 指定 し た位置 (x,y) に描画 し ます。テキス ト を複数行に折り返すには、 オプ シ ョ ナルなmaxWidth パラ メ タに、 行の幅を ピ ク セル単位で指定 し ます。行の先頭では空白が除去 さ れ、 テ キ ス ト は単語境界か改行キ ャ ラ ク タ に出会 う と 分割 さ れます。最大幅より長い単語は、最も近い文字で分割されます(つまり、ハイフネーションはありません)。

void QCanvasPainter::fillText(const QString &text, const QRectF &rect)

rect 内にtext 文字列を、現在の textAlign と textBaseline で描画します。rect パラメータの幅が maxWidth として使用されます。

これはQRectF を使ったオーバーロードされたメソッドです。こ の メ ソ ッ ド でテ キ ス ト を描 く 際、 テ キ ス ト ベース ラ イ ン をTextBaseline::TopTextBaseline::Middle に設定す る と 便利な こ と が多 く あ り ます。

これはオーバーロードされた関数です。

void QCanvasPainter::fillText(const QString &text, QPointF point, float maxWidth = -1)

text 文字列を、現在の textAlign と textBaseline で、指定されたpoint に描画します。テキス ト を複数行に折り返すには、 オプ シ ョ ナルなmaxWidth パラ メ タ を、 ピ ク セル単位で希望の行幅に設定 し ます。空白は行の先頭で除去 さ れ、 テ キ ス ト は単語境界か改行キ ャ ラ ク タ に出会 う と 分割 さ れます。最大幅よりも長い単語は、最も近い文字で分割されます (つまり、ハイフネーションは行われません)。

これはQPointF を使ったオーバーロードされたメソッドです。

これはオーバーロードされた関数です。

QTransform QCanvasPainter::getTransform() const

現在のトランスフォームを返します。

void QCanvasPainter::lineTo(float x, float y)

パ ス内の最後の点か ら 点(x,y) ま での線分を追加 し ます。

p->beginPath();
p->moveTo(20, 20);
p->lineTo(140, 180);
p->lineTo(180, 120);
p->stroke();

void QCanvasPainter::lineTo(QPointF point)

パスの最後の点からpoint までの線分を追加します。

これはオーバーロードされた関数です。

[static] float QCanvasPainter::mmToPx(float mm)

ミリメートルmm をピクセルに変換する静的ヘルパーメソッド。これにより、解像度に依存しない描画が可能になります。例えば、線幅を 2mm に設定するには次のようにします:

painter->setLineWidth(QCanvasPainter::mmToPx(2));

void QCanvasPainter::moveTo(float x, float y)

(x,y) を最初の点として、新しいサブパスを開始する。

void QCanvasPainter::moveTo(QPointF point)

point を最初の点として新しいサブパスを開始する。

これはオーバーロードされた関数である。

[static] float QCanvasPainter::ptToPx(float pt)

pt をピクセルに変換する静的ヘルパーメソッド。

void QCanvasPainter::quadraticCurveTo(float cpX, float cpY, float x, float y)

パ ス内の最後の点か ら 、 制御点(cpX,cpY) を経由 し て、 指定点(x,y) ま での二次ベ ジ エ 線分を追加 し ます。

p->beginPath();
p->moveTo(20, 20);
p->quadraticCurveTo(150, 50, 180, 180);
p->quadraticCurveTo(20, 220, 20, 20);
p->fill();
p->stroke();

void QCanvasPainter::quadraticCurveTo(QPointF controlPoint, QPointF endPoint)

パスの最後の点からcontrolPoint を経由して、指定されたendPoint に二次ベジエセグメントを追加します。

これはオーバーロードされた関数です。

void QCanvasPainter::rect(float x, float y, float width, float height)

位置x,y に、サイズwidth,height を持つ新しい矩形状のサブパスを作成する。

p->beginPath();
p->rect(20, 20, 160, 160);
p->fill();
p->stroke();

void QCanvasPainter::rect(const QRectF &rect)

rect に新しい矩形状のサブパスを作成する。これはQRectF を使ったオーバーロードされたメソッドである。

これはオーバーロードされた関数です。

void QCanvasPainter::removeImage(const QCanvasImage &image)

image に関連付けられたリソースを解放し、ペインターから画像を削除します。

注意: テクスチャのようなリソースはペインターのデストラクタで解放されるため、通常この関数を呼び出す必要はありません。この関数は、たくさんの画像があり、そのうちのいくつかはもう使わないので、メモリ使用量を減らす必要がある場合に便利です。

注意: 削除された画像は、もうペイント操作では使えません。

注意: 基礎となる 3D API で作成されたテクスチャなどのリソースは、すぐには解放されないかもしれません。このような操作は、QCanvasPainter 、アクティブな描画呼び出しのセットが送信された後、この が再び描画を開始するときなど、後続のフレームに延期されることがあります。

addImage()も参照してください

void QCanvasPainter::removePathGroup(int pathGroup)

ペインターキャッシュからpathGroup を削除する。この後にpathGroup に対してfill() またはstroke() を呼び出すと、グループキャッシュにパスが再生成されます。

注意: パスはペインターのデストラクタで削除されるため、通常は呼び出す必要はありません。pathGroup が不要になったときや、パスのコマンド数が大幅に減ってバッファサイズが小さくなったときなど、メモリ使用量を減らすためだけに使用してください。

fill() およびstroke()も参照して ください。

QCanvasPainter::RenderHints QCanvasPainter::renderHints() const

このペインターに設定されているレンダリングヒントを指定するフラグを返します。

setRenderHints() およびsetRenderHint()も参照 ください。

void QCanvasPainter::reset()

現在のペインターの状態をデフォルト値にリセットします。

注意: このメソッドは HTML canvas 2D context reset() メソッドとは異なり、canvas バッファを視覚的にクリアしません。

// Adjust the paint state
p->setStrokeStyle("#00414A");
p->setFillStyle("#2CDE85");
p->setLineWidth(10);
QRectF rect(20, 40, 160, 50);
p->translate(rect.center());
p->rotate(qDegreesToRadians(-25));
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 20);
p->fill();
p->stroke();
// Reset to default paint state
p->reset();
p->fillRect(20, 140, 60, 40);
p->strokeRect(120, 140, 60, 40);

save() およびrestore()も参照ください

void QCanvasPainter::resetClipping()

クリッピングをリセットして無効にする。

setClipRect()も参照

void QCanvasPainter::resetTransform()

現在の変換を ID 行列にリセットします。

void QCanvasPainter::restore()

現在のレンダリング状態をポップ・アンド・リストアする。つまり、以前に保存された状態が復元される。save() が呼び出されておらず、状態スタックが空の場合、これを呼び出しても何も起こらない。

save()も参照

void QCanvasPainter::rotate(float angle)

現在の座標系を時計回 り にangle だけ回転 さ せます。

角度はラジアン単位で指定する。度からラジアンに変換するにはqDegreesToRadians() を使用します。

QRectF rect(20, 70, 160, 60);
p->translate(rect.center());
p->rotate(-M_PI / 4);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

void QCanvasPainter::roundRect(float x, float y, float width, float height, float radius)

位置x,y に、サイズwidth,height で、丸みを帯びた長方形状の新しいサブパスを作成する。角丸はradius になります。

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
p->fill();
p->stroke();

void QCanvasPainter::roundRect(const QRectF &rect, float radius)

radius のコーナーを持つrect に新しい丸みを帯びた矩形状のサブパスを作成する。これはQRectF を使ったオーバーロードされたメソッドである。

これはオーバーロードされた関数です。

void QCanvasPainter::roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

丸みを帯びた長方形のサブパスをrect に作成する。角の丸め方は、radiusTopLeft,radiusTopRight,radiusBottomRight,radiusBottomLeft と、角ごとに変えることができる。

これはオーバーロードされた関数です。

void QCanvasPainter::roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

位置x,y に、サイズwidth,height で、丸みを帯びた長方形状の新しいサブパスを作成します。角の丸め方は、radiusTopLeft,radiusTopRight,radiusBottomRight,radiusBottomLeft と、角ごとに変えることができます。

p->beginPath();
p->roundRect(20, 20, 160, 160,
             0, 40, 20, 80);
p->fill();
p->stroke();

これはオーバーロードされた関数です。

void QCanvasPainter::save()

現在のレンダリング状態を状態スタックにプッシュして保存する。状態を復元するには、一致するrestore() を使用しなければならない。

p->strokeRect(20, 20, 160, 40);
// Save and adjust the paint state
p->save();
p->setStrokeStyle(QColorConstants::Black);
p->setLineWidth(3);
p->rotate(0.1);
p->strokeRect(20, 80, 180, 20);
// Restore the saved paint state
p->restore();
p->strokeRect(20, 140, 160, 40);

restore()も参照してください

void QCanvasPainter::scale(float scale)

カ レ ン ト 座標系をscale で拡大縮小 し ます。x 座標も y 座標も均等にスケーリングされます。

QRectF rect(20, 20, 160, 160);
for (int i = 0; i < 20; i++) {
    p->beginPath();
    p->roundRect(rect, 10);
    p->stroke();
    p->translate(rect.center());
    p->scale(0.8);
    p->translate(-rect.center());
}

void QCanvasPainter::scale(float scaleX, float scaleY)

現在の座標系をscaleXscaleY でスケーリングする。

これはオーバーロードされた関数です。

void QCanvasPainter::setAntialias(float antialias)

現在のアンチエイリアス量をピクセル単位でantialias に設定する。アンチエイリアスが大きいほど、ペイントが滑らかになります。こ れは塗 り と 描線にのみ影響 し 、 画像やテ キ ス ト には影響 し ません。デフォルト値は1.0 で、最大値は10.0 です。

アンチエイリアスはパスごとに変更できるので、各ストローク/塗りつぶしの前に設定できます。キャンバス全体のペインターからアンチエイリアスを無効にするには、QCanvasPainter::RenderHint::Antialiasing レンダーヒントを使用します。

p->setLineWidth(6);
for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setAntialias(i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

setRenderHints() およびsetTextAntialias()も参照してください

void QCanvasPainter::setBrushTransform(const QTransform &transform)

カ レ ン ト ブ ラ シの変形をtransform に設定 し ます。 こ の変形は、 描線ブラシ と 塗 り ブラシの両方に適用 さ れます。

void QCanvasPainter::setClipRect(float x, float y, float width, float height)

カ レ ン ト の切 り 込み矩形を (x,y,width,height )に設定 し ます。ハサミ矩形は現在のトランスフォームによって変換されます。

注意: クリッピングにはパフォーマンス上のコストがあるため、必要な場合にのみ使用してください。

QRectF viewArea(20, 20, 160, 160);
p->setClipRect(viewArea);
p->beginPath();
p->circle(40, 40, 110);
p->fill();
p->setFillStyle(Qt::black);
p->fillText("Clip me...", 40, 100);
p->strokeRect(viewArea);

resetClipping()も参照してください

void QCanvasPainter::setClipRect(const QRectF &rect)

カ レ ン ト の切 り 抜き矩形をrect に設定 し ます。 切 り 抜 き 矩形はカ レ ン ト の変形で変換 さ れます。

注意: クリッピングにはパフォーマンス上のコストがあるので、必要なときだけ使うようにしましょう。

これはオーバーロードされた関数です。

resetClipping()も参照してください

void QCanvasPainter::setFillStyle(const QColor &color)

塗 り のス タ イルをベタcolor 。 デフ ォル ト の塗 り のス タ イルは黒ベタ (0, 0, 0, 1)。

p->setFillStyle(QColorConstants::Black);
p->fillRect(20, 20, 160, 160);
p->setFillStyle(QColor(0, 65, 74));
p->fillRect(40, 40, 120, 120);
p->setFillStyle("#2CDE85");
p->fillRect(60, 60, 80, 80);

void QCanvasPainter::setFillStyle(const QCanvasBrush &brush)

塗りつぶしスタイルをbrush に設定します。 デフォルトの塗りつぶしスタイルは黒ベタ(0, 0, 0, 1)です。

QCanvasRadialGradient g2(140, 40, 300);
g2.setStartColor(QColor(44, 222, 133));
g2.setEndColor(QColor(0, 65, 74));
p->setFillStyle(g2);
p->fillRect(20, 20, 160, 160);
g2.setCenterPosition(100, 100);
p->setFillStyle(g2);
p->fillRect(40, 40, 120, 120);

これはオーバーロードされた関数です。

void QCanvasPainter::setFont(const QFont &font)

font を現在アクティブなフォントとして設定する。

void QCanvasPainter::setGlobalAlpha(float alpha)

グローバルなアルファ値 (透明度) をalpha に設定します。 このアルファ値は、レンダリングされるすべての図形に適用されます。すでに透明なパスも比例して透明になります。アルファ値は 0.0(完全に透明)から 1.0(完全に不透明)の間でなければなりません。デフォルトのアルファ値は1.0 です。

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalAlpha(1.0 - i * 0.3);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalBrightness(float value)

グローバルな明るさをvalue に設定します。 この明るさは、レンダリングされたすべての図形に適用されます。値が 0 の場合、描画は完全に黒くなります。値を 1.0 より大きくすると、明るさが増します。デフォルトでは、明るさは1.0 です。

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalBrightness(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)

グローバル合成操作モードをoperation に設定します。 このモードはすべてのペインティング操作に適用されます。デフ ォル ト のモー ド はQCanvasPainter::CompositeOperation::SourceOver です。

void QCanvasPainter::setGlobalContrast(float value)

グローバルコントラストをvalue に設定します。 このコントラストはレンダリングされたすべての図形に適用されます。値が 0 の場合、描画は完全に灰色になります(0.5, 0.5, 0.5)。値を 1.0 よ り 大 き く す る こ と も で き 、 コ ン ト ラ ス ト を強め る こ と がで き ます。デフォルトでは、コントラストは1.0 です。

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalContrast(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalSaturate(float value)

グローバルな彩度をvalue に設定します。この彩度はレンダリングされたすべての形状に適用されます。値を 0 に設定すると彩度が無効になり、ペイントは完全にグレースケールになります。値を 1.0 より大きくすると、彩度を上げることもできます。デフォルトでは、彩度は1.0 です。

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalSaturate(1.5 - i * 0.5);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setLineCap(QCanvasPainter::LineCap cap)

ストークの行末をcap に設定する。 デフォルトのラインキャップはQCanvasPainter::LineCap::Butt

QCanvasPath path;
path.moveTo(40, 60);
path.lineTo(160, 60);
p->setLineCap(QCanvasPainter::LineCap::Butt);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Square);
p->translate(0, 40);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Round);
p->translate(0, 40);
p->stroke(path, -1);

void QCanvasPainter::setLineJoin(QCanvasPainter::LineJoin join)

stroke の線結合をjoin に設定し ます。 デフ ォル ト の線結合はQCanvasPainter::LineJoin::Miter です。

QCanvasPath path;
path.moveTo(40, 20);
path.lineTo(100, 80);
path.lineTo(160, 40);
path.lineTo(160, 70);
p->setLineJoin(QCanvasPainter::LineJoin::Miter);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Bevel);
p->translate(0, 50);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Round);
p->translate(0, 50);
p->stroke(path, -1);

setMiterLimit()も参照

void QCanvasPainter::setLineWidth(float width)

stroke の線幅をピクセル単位でwidth に設定します。デフォルトの線幅は1.0 。アンチエイリアシングを有効にすると、1ピクセル以下の線幅は自動的に不透明度が薄くなり、滑らかな出力になります。

for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setLineWidth(0.5 * i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

stroke()も参照

void QCanvasPainter::setMiterLimit(float limit)

マイターリミットをlimit に設定する。マイターリミットは、鋭いコーナーが面取りされるタイミングを制御します。コーナーの長さがこの制限より長くなる場合、代わりにライン間にQCanvasPainter::LineJoin::Bevel が適用されます。こ れはQCanvasPainter::LineJoin::Miter の線結合に対 し てのみ効力を持ち ます。デフ ォル ト の制限は10.0 です。

setLineJoin()も参照

void QCanvasPainter::setPathWinding(QCanvasPainter::PathWinding winding)

現在のサブパスwindingCounterClockWise (デフォルト) またはClockWise のいずれかに設定します。CounterClockWise は実線のサブパスを描画し、ClockWise は穴を描画します。

p->beginPath();
p->roundRect(20, 20, 160, 160, 40);
p->setPathWinding(QCanvasPainter::PathWinding::ClockWise);
p->circle(140, 60, 20);
p->rect(60, 120, 80, 30);
p->fill();
p->stroke();

beginHoleSubPath() およびbeginSolidSubPath()も参照

void QCanvasPainter::setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)

on が true の場合、指定されたレンダーhint をペインターに設定します。そうでない場合、レンダーヒントをクリアします。

setRenderHints() およびrenderHints()も参照してください

void QCanvasPainter::setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)

on が true の場合、指定されたレンダーhints をペインターに設定します。それ以外の場合、レンダーヒントをクリアします。

setRenderHint() およびrenderHints()も参照してください

void QCanvasPainter::setStrokeStyle(const QColor &color)

描線ス タ イルをベタcolor 。 デフ ォル ト の描線ス タ イルは黒ベタ (0, 0, 0, 1)。

p->setStrokeStyle(QColorConstants::Black);
p->strokeRect(20, 20, 160, 160);
p->setStrokeStyle(QColor(0, 65, 74));
p->strokeRect(40, 40, 120, 120);
p->setStrokeStyle("#2CDE85");
p->strokeRect(60, 60, 80, 80);

void QCanvasPainter::setStrokeStyle(const QCanvasBrush &brush)

ストロークスタイルをbrush に設定します。 デフォルトのストロークスタイルは黒ベタ(0, 0, 0, 1)です。

QCanvasLinearGradient g1(180, 20, 20, 180);
g1.setStartColor(QColor(44, 222, 133));
g1.setEndColor(Qt::black);
p->setStrokeStyle(g1);
p->strokeRect(20, 20, 160, 160);
g1.setEndColor(Qt::yellow);
p->setStrokeStyle(g1);
p->strokeRect(40, 40, 120, 120);

これはオーバーロードされた関数です。

void QCanvasPainter::setTextAlign(QCanvasPainter::TextAlign align)

テ キ ス ト の横揃えをalign に設定 し ます。 デフ ォル ト の横揃えはQCanvasPainter::TextAlign::Start です。

QFont font("Titillium Web", 22);
p->setFont(font);
p->fillRect(100, 0, 1, 200);
p->setTextAlign(QCanvasPainter::TextAlign::Left);
p->fillText("Left", 100, 40);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->fillText("Center", 100, 70);
p->setTextAlign(QCanvasPainter::TextAlign::Right);
p->fillText("Right", 100, 100);
p->setTextAlign(QCanvasPainter::TextAlign::Start);
p->fillText("Start", 100, 130);
p->setTextAlign(QCanvasPainter::TextAlign::End);
p->fillText("End", 100, 160);

setTextBaseline()も参照

void QCanvasPainter::setTextAntialias(float antialias)

現在のテキス ト アンチエイリアス量を設定。値antialias は通常のアンチエイリアシングに対する倍率で、つまり0.0 はアンチエイリアシングを無効にし、2.0 はそれを 2 倍にします。デフォルト値は1.0です。

注: 使用されているテキスト・アンチエイリアス技法(SDF)のため、アンチエイリアス量の最大値はかなり制限されており、フォントサイズが小さい場合にはあまり影響しません。

QFont font("Titillium Web", 20);
p->setFont(font);
p->setTextAntialias(1.0);
p->fillText("Antialiasing: 1.0", 100, 25);
p->setTextAntialias(2.0);
p->fillText("Antialiasing: 2.0", 100, 75);
p->setTextAntialias(3.0);
p->fillText("Antialiasing: 3.0", 100, 125);
p->setTextAntialias(4.0);
p->fillText("Antialiasing: 4.0", 100, 175);

void QCanvasPainter::setTextBaseline(QCanvasPainter::TextBaseline baseline)

テキス ト の縦揃え (ベース ラ イ ン) をbaseline に設定 し ます。 デフ ォル ト の縦揃えはQCanvasPainter::TextBaseline::Alphabetic です。

QFont font("Titillium Web", 16);
p->setFont(font);
p->fillRect(0, 60, 200, 1);
p->fillRect(0, 140, 200, 1);
p->setTextBaseline(QCanvasPainter::TextBaseline::Bottom);
p->fillText("Bottom", 40, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
p->fillText("Middle", 100, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Top);
p->fillText("Top", 160, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Alphabetic);
p->fillText("Alphabetic", 50, 140);
p->setTextBaseline(QCanvasPainter::TextBaseline::Hanging);
p->fillText("Hanging", 150, 140);

setTextAlign()も参照

void QCanvasPainter::setTextDirection(QCanvasPainter::TextDirection direction)

テ キ ス ト の方向をdirection に設定 し ます。 デフ ォル ト の方向はQCanvasPainter::TextDirection::Inherit です。

void QCanvasPainter::setTextLineHeight(float height)

折 り 返 し テキス ト の行の高 さ の調整を ピ ク セル単位でheight に設定 し ます。デフ ォル ト の行の高 さ は0 です。

QRectF r1(40, 5, 120, 60);
QRectF r2(40, 70, 120, 60);
QRectF r3(40, 135, 120, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
p->setTextLineHeight(-10);
p->fillText("Text with line height: -10", r1);
p->setTextLineHeight(0);
p->fillText("Text with line height: 0", r2);
p->setTextLineHeight(10);
p->fillText("Text with line height: 10", r3);

void QCanvasPainter::setTextWrapMode(QCanvasPainter::WrapMode wrapMode)

テキス ト の回 り 込みモー ド をwrapMode に設定 し ます。 デフ ォル ト の回 り 込みモー ド はQCanvasPainter::WrapMode::NoWrap です。

QRectF r1(50, 5, 100, 60);
QRectF r2(50, 70, 100, 60);
QRectF r3(50, 135, 100, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
QString s("This is a long string.");
p->setTextWrapMode(QCanvasPainter::WrapMode::NoWrap);
p->fillText(s, r1);
p->setTextWrapMode(QCanvasPainter::WrapMode::Wrap);
p->fillText(s, r2);
p->setTextWrapMode(QCanvasPainter::WrapMode::WrapAnywhere);
p->fillText(s, r3);

void QCanvasPainter::setTransform(const QTransform &transform)

現在の変換をリセットし、代わりにtransform を使用する。

p->beginPath();
p->roundRect(80, 20, 40, 40, 10);
p->fill();
p->stroke();
QTransform t;
t.translate(100, 20);
t.rotate(45);
t.scale(2.0, 2.0);
p->setTransform(t);
p->beginPath();
p->roundRect(20, 20, 40, 40, 10);
p->fill();
p->stroke();

transform()も参照

void QCanvasPainter::skew(float angleX, float angleY = 0.0f)

カ レ ン ト 座標系を X 軸に沿っ てangleX 、Y 軸に沿っ てangleY 、スキュー (シアー) さ せます。角度はラジアン単位で指定します。

QRectF rect(40, 70, 120, 60);
p->translate(rect.center());
p->skew(-0.6);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

void QCanvasPainter::stroke()

カ レ ン ト パ ス を カ レ ン ト 描線ス タ イルで描線 し ます。

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->stroke();

setStrokeStyle()も参照

void QCanvasPainter::stroke(const QCanvasPath &path, int pathGroup = 0)

現在のストロークスタイルでpath をストロークし、pathGroup に属する。QCanvasPath を通 じ て描 く こ と は、 パ ス に よ り 多 く の コ マ ン ド が含まれてお り 、 その大部分が静的であ る と き に最適です。デフォルトでは、pathGroup0 であるため、最初のグループを使用します。pathGroup-1 の場合、パスは GPU 側でキャッシュされません。パス・キャッシュ・グループの使用に関する詳細は、QCanvasPath ドキュメントを参照してください。このメソッドの前にbeginPath() を呼び出す必要はありません。

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        int h = 100 + 60 * sin(i);
        m_path.rect(22 + i * 10,
                    180 - h,
                    6, h);
    }
}
p->stroke(m_path);

これはオーバーロードされた関数です。

setStrokeStyle()も参照してください

void QCanvasPainter::strokeRect(float x, float y, float width, float height)

指定した位置 (x,y) に、矩形をサイズwidth,height で描画します。

注意: これは便宜上提供されています。複数の矩形を描画する場合は、rect() を使用してください。

p->strokeRect(20, 20, 160, 160);
// The above code does same as:
// p->beginPath();
// p->rect(20, 20, 160, 160);
// p->stroke();

void QCanvasPainter::strokeRect(const QRectF &rect)

rect に矩形を描画します。これはQRectF を使ったオーバーロードされたメソッドです。

注意: これは便宜上提供されています。1つ以上の矩形を描画する場合は、rect() を使用することをお勧めします。

これはオーバーロードされた関数です。

QRectF QCanvasPainter::textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)

text の文字列の外接枠を (x,y) で測定する。複数行のテキストを測定するには、オプションのパラメータmaxWidth に、希望する行の幅をピクセル単位で設定します。値 [xmin, ymin, width, height] を持つQRectF を返します。測定値は、 ロ ーカル座標空間で返 さ れます。

QString s("Built with Qt");
QPointF pos1(20, 20);
QRectF box1 = p->textBoundingBox(s, pos1);
p->strokeRect(box1);
p->fillText(s, pos1);
p->setTextWrapMode(QCanvasPainter::WrapMode::WordWrap);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
QPointF pos2(100, 80);
QRectF box2 = p->textBoundingBox(s, pos2, 100);
p->strokeRect(box2);
p->fillText(s, pos2, 100);

QRectF QCanvasPainter::textBoundingBox(const QString &text, const QRectF &rect)

recttext 文字列の外接枠を測定する。値 [xmin, ymin, width, height] を持つQRectF を返します。測定値はローカル座標空間で返されます。

これはオーバーロードされた関数です。

QRectF QCanvasPainter::textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)

pointtext 文字列の外接枠を測定する。複数行のテキストを測定するには、オプションのパラメータmaxWidth に、希望する行の幅をピクセル単位で設定します。値 [xmin, ymin, width, height] を持つQRectF を返します。測定値はローカル座標空間で返されます。

これはオーバーロードされた関数です。

void QCanvasPainter::transform(const QTransform &transform)

現在の座標系に、 指定 し たtransform を掛け算 し ます。

QTransform t;
t.translate(100, 100);
t.rotate(36);
t.translate(-100, -100);
for (int i = 0; i < 10; i++) {
    p->transform(t);
    p->beginPath();
    p->roundRect(80, 15, 40, 20, 10);
    p->fill();
    p->stroke();
}

setTransform()も参照

void QCanvasPainter::translate(float x, float y)

現在の座標系をxy で変換する。

auto paintRect = [p]() {
    p->beginPath();
    p->roundRect(20, 20, 160, 60, 10);
    p->fill();
    p->stroke();
};
paintRect();
p->translate(0, 100);
paintRect();

void QCanvasPainter::translate(QPointF point)

現在の座標系をpoint で変換する。

これはオーバーロードされた関数である。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.