Qt プログラミング – QWidgetのカスタマイズ

津路です。
今回は、Qt4の書籍を引っ張り出して、カスタムウィジェットの作成に取り組みます。
まず、前準備として、16進数スピンボックスを作成します。
HexSpinBoxを、QSpinBoxから派生します。
#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ケタまで許します。
#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から派生したクラスを作成します。
#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を再実装します。
次回に、詳細を説明します。