Qt GUIプログラミング:QPaintEngine::drawEllipse()を使いこなすためのガイド


QPaintEngine::drawEllipse()は、Qt GUIライブラリにおいて、楕円を描画するための関数です。この関数は、QPaintEngineクラスのメンバー関数であり、QRectF型の引数を受け取り、その矩形内に最大の楕円を描画します。

引数

  • rect: 楕円を描画する矩形を指定するQRectF型の引数です。

戻り値

なし

詳細

QPaintEngine::drawEllipse()は、内部的にQPainterPathクラスを使用して楕円のパスを作成し、そのパスを使用して楕円を描画します。この関数は、QPaintEngineクラスのサブクラスによって再実装されることが想定されており、サブクラスは独自の描画アルゴリズムを実装することができます。

QRectF rect(10, 20, 50, 30);
painter->begin(myWidget);
painter->drawEllipse(rect);
painter->end();

このコードは、QRectF型の矩形 rect を定義し、painter オブジェクトを使用してその矩形内に楕円を描画します。

  • QPaintEngine::drawEllipse()は、塗りつぶされた楕円と線描きの楕円の両方を描画することができます。塗りつぶされた楕円を描画するには、painter オブジェクトの setBrush() 関数を使用してブラシを設定する必要があります。線描きの楕円を描画するには、painter オブジェクトの setPen() 関数を使用してペンを設定する必要があります。


#include <QApplication>
#include <QWidget>
#include <QPainter>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setFixedSize(200, 150);
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        QPainter painter(this);

        // 塗りつぶされた赤い楕円を描く
        painter.setBrush(Qt::red);
        painter.drawEllipse(QRectF(10, 20, 50, 30));

        // 線描きの青い楕円を描く
        painter.setPen(Qt::blue);
        painter.drawEllipse(QRectF(80, 50, 60, 40));
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

このコードは以下の動作をします。

  1. MyWidget クラスを定義します。このクラスは QWidget クラスを継承しており、paintEvent() メンバ関数をオーバーライドしています。
  2. paintEvent() メンバ関数内で、QPainter オブジェクトを作成し、ウィンドウ内に楕円を描画します。
  3. 塗りつぶされた赤い楕円を描画するには、painter オブジェクトの setBrush() 関数を使用して赤いブラシを設定し、drawEllipse() 関数を呼び出します。
  4. 線描きの青い楕円を描画するには、painter オブジェクトの setPen() 関数を使用して青いペンを設定し、drawEllipse() 関数を呼び出します。
  5. main() 関数内で、QApplication オブジェクトを作成し、MyWidget ウィジェットを作成して表示します。


QPainterPath クラスを使用する

QPainterPath クラスは、2D パスを定義するためのクラスです。このクラスを使用して、楕円を含む任意の形状のパスを作成できます。その後、QPainter オブジェクトを使用して、パスを描画することができます。

QRectF rect(10, 20, 50, 30);
QPainterPath path;
path.addEllipse(rect);

painter->begin(myWidget);
painter->drawPath(path);
painter->end();

このコードは、QRectF型の矩形 rect を定義し、QPainterPath オブジェクト path を作成します。その後、path オブジェクトに rect 矩形を含む楕円を追加し、painter オブジェクトを使用してパスを描画します。

QGraphicsItem クラスを使用する

QGraphicsItem クラスは、グラフィックスシーン内のアイテムを表現するためのクラスです。このクラスを使用して、楕円を含む任意の形状のアイテムを作成できます。その後、QGraphicsScene オブジェクトを使用してアイテムをシーンに追加し、QGraphicsView オブジェクトを使用してシーンをレンダリングすることができます。

class MyEllipse : public QGraphicsItem
{
public:
    MyEllipse(const QRectF &rect)
    {
        setRect(rect);
    }

protected:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        painter->setBrush(Qt::red);
        painter->drawEllipse(rect());
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QGraphicsScene scene;
    MyEllipse *ellipse = new MyEllipse(QRectF(10, 20, 50, 30));
    scene.addItem(ellipse);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

このコードは、MyEllipse クラスを定義します。このクラスは QGraphicsItem クラスを継承しており、paint() メンバ関数をオーバーライドしています。paint() メンバ関数内で、painter オブジェクトを使用して赤い楕円を描画します。その後、main() 関数内で、QGraphicsScene オブジェクトと MyEllipse オブジェクトを作成し、QGraphicsView オブジェクトを使用してシーンをレンダリングします。

OpenGL を使用する

OpenGL は、2D および 3D グラフィックスをレンダリングするための低レベルな API です。OpenGL を使用して、楕円を含む任意の形状を描画することができます。ただし、OpenGL は Qt GUI ライブラリよりも高度な API であり、習得に時間がかかる場合があります。

#include <QOpenGLWidget>

class MyWidget : public QOpenGLWidget
{
public:
    MyWidget()
    {
        makeCurrent();
    }

protected:
    void paintGL() override
    {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 100, 0, 100, -1, 1);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glBegin(GL_POLYGON);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(25, 50);
        glVertex2f(75, 50);
        glVertex2f(75, 25);
        glVertex2f(25, 25);
        glEnd();
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}