丸いQtウイジェット

Qtで作るプログラムもほぼ完成まで来たなと思っている。
なんと丸3日でそれなりのものができたというのは驚くところ。
ただ、まだ詰めが甘いかなと思うところもあるし、他にもやることはあるし。
2日後の展示のためのプログラムなのですが、果たしていけるのだろうか。


今日のお題はQtで丸いウイジェットを作る方法。
普通はウイジェットっていうのは四角いものです。
ですが、丸の部分以外を表示しなければ丸く見えるということで丸いウイジェットを作れるわけです。
この辺は.NET Frameworkでもありますよね。
System.Windows.Forms.ControlのRegionプロパティにしかるべき領域を設定すると。
それに相当するQtのはQWidgetのsetMaskですね。


Circleクラスとして作ってみた。
まずヘッダファイル。

#ifndef CIRCLE_H
#define CIRCLE_H
#include <QtGui/QWidget>
class Circle : public QWidget{
Q_OBJECT
public:
Circle(QWidget* parent=0);
};
#endif // CIRCLE_H

単に継承しただけです。なんてことはありません。
そしてソースファイル。

#include "circle.h"
Circle::Circle(QWidget *parent) : QWidget(parent){
this->setMaximumSize(60,60);
this->setMinimumSize(60,60);
this->setMask(QRegion(QRect(0,0,60,60),QRegion::Ellipse));
QPalette mypalette;
mypalette.setColor(QPalette::Window,QColor(Qt::red));
this->setPalette(mypalette);
this->setAutoFillBackground(true);
}

setMaskにQRegionのオブジェクトを与えて設定する。
あと、色を変えるためにパレットをいじったりしているが、基本的にはsetMaskするだけ。


さて、この自作ウイジェットをフォームに貼り付けよう。
と考えるのはもっともな話でどうやって貼ろうか僕も考えたものです。
デザイナーから自作ウイジェットを貼る方法は少々複雑です。
その自作ウイジェットの基底クラスのウイジェットを配置して、それを格上げするという方法でやります。
その配置したウイジェットで右クリックして、「格上げ先を指定」で設定するわけです。
新しい格上げされたクラスでCircleクラスを追加して、その追加されたのを選らんで格上げとすればいいわけです。
見た目は何も変わりませんが、これでCircleクラスのウイジェットに化けたわけです。
これで実行してみると赤い丸が見えるはず。


こんな丸いもん作ってどうすると思う人もあるかも知れない。
けど画像として丸を表示するよりも良い点もあるわけです。
例えば丸の部分だけがクリックに反応したり。
なかなか面白いのでいろいろ試してみてください。