つくねの手帳

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

Qt スタイルシート優先度と追加指定

前回スタイルシート設定について書いたので、その少し続きを…


スタイルシート設定は後から設定した物が優先で使用されます。


widget->setStyleSheet("background-color : rgb( 0 , 0 , 0 );");

widget->setStyleSheet("background-color : rgb( 255 , 255 , 255 );");


この場合、widgetの背景色は白になります。



また、後からスタイル設定をすると、前回の設定は引き継がれません。

widget->setStyleSheet("background-color : rgb( 0 , 255 , 0 );color :
 rgb( 255,255,255);"); // 背景緑 文字色白

widget->setStyleSheet("color : rgb( 255 , 0 , 0 );"); // 文字色赤

この場合、文字色の変更は反映されますが、背景色緑の設定が失われてしまいます。


後からスタイルの情報を追加したい場合は、QWidgetクラスからstylesheetのプロパティを取得し、スタイルを追加します。

void CreateLabel()
 {
     QLabel* label = new QLabel("text",this);
     label->setStyleSheet("color : rgb( 255 , 0 , 0 );") // 文字色は赤

     addStyleSheet(label);
 }

 void addStyleSheet(QLabel* label)
 {
     // スタイルシート情報取得
     QString str = label->styleSheet();
     // 追加したいスタイルを連結
     str += "background-color : rgb( 0 , 255 , 0 );"; // 背景色は緑

     label->setStyleSheet(str);
 }

Qt スタイルシート指定でのウィジェットデザイン

ウィジェットのスタイル指定が出来るsetStyleSheet(const QString &str)で、よく使いそうな記述をまとめようと思います。

・背景色の指定

widget->setStyleSheet("background-color : rgb(255,255,255);");

・文字色の指定

widget->setStyleSheet("color : rgb(255,255,255);");

以下のようにすれば、背景、前景に透過度も指定できます。

widget->setStyleSheet("background-color : rgba(255,255,255,128);");

・枠線幅指定

widget->setStyleSheet("border-width : 1px;");

・枠線スタイル指定

widget->setStyleSheet("border-style : solid;"); // 実線枠

・枠線色指定

widget->setStyleSheet("border-color : rgb(255,255,255);");

基本的に複数の指定を行うと思いますが、それぞれを""でくくって一括指定ができます。

widget->setStyleSheet("border-style : solid;" "border-width : 1px;" "border-color : rgb(255,255,255);" "background-color : rgba(255,255,255,128);" );

もちろん引数の文字列はQStringを別に生成し関数に渡してもOKです。

QString str;
str = "border-color : rgb(255,255,255);";
widget->setStyleSheet(str);