2011年12月23日金曜日

( Qt C++ )QPainterを用いて扇形の図形を描く


最近、本当に歌番組を見ない。昔はたまに見ていたりしたのだが最近は歌手が出た瞬間チャンネルを変える。なんていうか下手すぎて見ているこっちが恥ずかしいのだ。まず言いたいのは腹から声出せってこと。これプロじゃなくても基本ですよね?技巧こらした楽曲だすのはいいけど歌唱力がついていってないとキャンキャン猿が叫んでるみたいな感じになる。声のとおっていない感じが見ていて非常に痛々しい。正直こんなものをありがたがっている人の思考が私には理解できません。
そういう点でまだ演歌歌手のほうがまだマシだなぁと思っている今日この頃です。
私の感性のほうがおかしいんですかね...。たまにわからなくなります。

はいそれでは本日2回目  "QPainterを用いて扇形の図形を描く" をやっていきます。
サンプルはC++ GUI Programming with Qt4のものを使います。また、いつものようにQtCreaterでQMainWindowやその他のGUI部品は定義済みであることとします。
(QtCreaterの使い方はQtをはじめようを見てください。)
ではコードを

(C++ GUI Programming with Qt4 178ページより)


(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);//アンチエイリアスセット
    painter.setPen(QPen(Qt::black, 12, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin));/*ペンセット*/
    painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));//ブラシセット
    painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16);//描画
}

はい、簡単ですね。ヘッダ、cpp共に今回の理解に重要なのはpaintEventだけです。
MainWindowのペイントイベントが来たらQPainterをthis(この場合MainWindow)で初期化。アンチエイリアスを設定し、使用するペン(輪郭描画)とブラシ(図形内部描画)を作成し、drawPieで扇形を描いています。各関数にはいろいろな種類がありますので詳細はリファレンスで確認してください。
(Qt::SolidLineとかQt::DiagCrossPatternなどの説明は後の記事でまとめます。)


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