大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

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

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2020/06/23
最終更新日:2020/06/23
カテゴリー:技術情報
タグ:

津路です。
今回は、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を再実装します。
次回に、詳細を説明します。

    上に戻る