つくねの手帳

C++およびAndroidアプリ開発メインで何か書きたい

Qt QWidgetの派生クラスへのスタイルシート設定

今日は、先日少しはまったQWidgetを基底クラスとしたクラスへのスタイルシート設定について。

QWidgetクラスは背景色のスタイル設定がサポートされています。
しかし、QLabelなどのように、そのままsetStyleSheet()を呼んでも反映されません。
以下のように、Q_OBJECTの指定と、paintEventを処理する必要があります。

// MyWidget.h
#include <QWidget>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget();
    ~MyWidget();

    void paintEvent(QPaintEvent*); // これが必要
};
// MyWidget.cpp

// スタイルシート設定を反映させるためのペイントイベント処理
void MyWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

QLabelなどはそのクラス内で処理してくれているようなのですが、QWidgetクラスでは実装されていないようです。
※なぜQWidgetクラスで処理が実装されていないのかはいまいちわからいままです…

Qtの公式リファレンスにも記載されているので参考に。
Qt Style Sheets Reference | Qt 4.8