Qt プログラミング – QWidgetのカスタマイズ
津路です。
今回は、Qt4の書籍を引っ張り出して、カスタムウィジェットの作成に取り組みます。
まず、前準備として、16進数スピンボックスを作成します。
HexSpinBoxを、QSpinBoxから派生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #ifndef HEXSPINBOX_H #define HEXSPINBOX_H #include <QSpinBox> class QRegExpValidator; class HexSpinBox : public QSpinBox { Q_OBJECT public: HexSpinBox(QWidget *parent=0); protected: QValidator::State validate(QString &text, int &pos) const; int valueFromText(const QString &text) const; QString textFromValue(int value) const; private: QRegExpValidator *validator; }; #endif |
値のレンジは、0~255に設定します。
入力値を制限するため、QRegExpValidatorを使用し、8ケタまで許します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <QtGui> #include "hexspinbox.h" HexSpinBox::HexSpinBox(QWidget *parent) : QSpinBox(parent) { setRange(0,255); validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this); } QValidator::State HexSpinBox::validate(QString &text, int &pos) const { return validator->validate(text, pos); } QString HexSpinBox::textFromValue(int value) const { return QString::number(value, 16).toUpper(); } int HexSpinBox::valueFromText(const QString &text) const { bool ok; return text.toInt(&ok,16); } |
さて、本題のQWidgetのカスタマイズですが、アイコン編集エディタを作成します。
IconEditorという名の、QWidgetから派生したクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #ifndef ICONEDITOR_H #define ICONEDITOR_H #include <QColor> #include <QImage> #include <QWidget> class IconEditor : QWidget { Q_OBJECT Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor) Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage) Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor) public: IconEditor(QWidget *parent=0); void setPenColor(const QColor &newColor); QColor penColor() const { return curColor; } void setZoomFactor(int newZoom); int zoomFactor() const { return zoom; } void setIconImage(const QImage &newImage); QImage iconImage() const { return image; } QSize sizeHint() const; protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event); private: void setImagePixel(const QPoint &pos, bool opaque); QRect pixelRect(int i, int j) const; QColor curColor; QImage image; int zoom; }; #endif |
プロパティは、penColor, iconImage, zoomFactorを宣言します。
イベントは、mousePressEvent, mouseMoveEvent, paintEventを再実装します。
次回に、詳細を説明します。