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();
}
このコードは以下の動作をします。
MyWidget
クラスを定義します。このクラスはQWidget
クラスを継承しており、paintEvent()
メンバ関数をオーバーライドしています。paintEvent()
メンバ関数内で、QPainter
オブジェクトを作成し、ウィンドウ内に楕円を描画します。- 塗りつぶされた赤い楕円を描画するには、
painter
オブジェクトのsetBrush()
関数を使用して赤いブラシを設定し、drawEllipse()
関数を呼び出します。 - 線描きの青い楕円を描画するには、
painter
オブジェクトのsetPen()
関数を使用して青いペンを設定し、drawEllipse()
関数を呼び出します。 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();
}