2011年12月24日土曜日

( Qt C++ )QPainterを用いたベジエ曲線描画


今回はQPainterで3次ベジェ曲線を描画します。
サンプルはC++ GUI Programming with Qt4の178ページのものを使います。
また、いつもどおりQtCreaterなどでQMainWindowなどのGUI部品は配置済みであるとします。(QtCreaterの使い方は "Qtをはじめよう" を見てください。)

ではコードを

(mainwindow.h)
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT//マクロ
   
public:
    explicit MainWindow(QWidget *parent = 0);//コンストラクタ
    ~MainWindow();//デストラクタ

protected:
    void paintEvent(QPaintEvent *);//←ここ重要!ペイントイベント
  
private:
    Ui::MainWindow *ui;//uiにはGUI部品が記述
}; 

(mainwindow.cpp)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiにはGUI部品に関する記述
{
    ui->setupUi(this);//uiのGUI部品の初期化
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)//←重要!ペイントイベント
{
     QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);//アンチエイリアスセット

    QPainterPath path;
    path.moveTo(80,320);//開始座標の移動
    path.cubicTo(200, 80, 320, 80, 480, 320);//3次ベジェ曲線を追加
    painter.setPen(QPen(Qt::black, 8));

    painter.drawPath(path);//パスを描く
} 

はい簡単ですね。理解に重要なのはpaintEventだけです。まずQPainterをthis(この場合MainWindow)で作成、アンチエイリアスを設定しています。その後QPainterPathを作成し、開始座標を移動してから3次ベジェ曲線を追加しています。最後にQPainterのdrawPathの引数に設定済みのQPainterPathをセットし描画しています。
QPainterPathクラスは様々な図形やその組み合わせをパスで表現できる機能をもったクラスです。(リファレンス) 今回は使っていませんがブラシももちろん使用できます。

実行すると以下のようになります。

 

以上です。