2015-03-21

Qtでグループボックスをカスタム描画する

QGroupBoxの枠の見た目を変えます。ついでに、ヘッダの高さを変更します。

QtMyGroupBox.zip

QProxyStyleクラスを継承します。QStyle::CC_GroupBoxのときだけ、矩形のサイズを書き換えて返します。

class MyGroupBoxStyle : public QProxyStyle {
private:
    int header_height;
public:
    MyGroupBoxStyle()
    : header_height(-1)
    {
    }
    QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const
    {
        if (cc == QStyle::CC_GroupBox) {
            if (header_height >= 0) {
                QRect r = QProxyStyle::subControlRect(cc, opt, sc, widget);
                r.setY(header_height);
                return r;
            }
        }
        return QProxyStyle::subControlRect(cc, opt, sc, widget);
    }
    void setHeaderHeight(int h)
    {
        header_height = h;
    }
};

class MyGroupBox : public QGroupBox
{ Q_OBJECT private: MyGroupBoxStyle style_; (略)
MyGroupBoxのコンストラクタで、スタイルオブジェクトを設定し、ヘッダの高さを変更します。
MyGroupBox::MyGroupBox(QWidget *parent)
    : QGroupBox(parent)
{
    setStyle(&style_);
    style_.setHeaderHeight(32);
}

void MyGroupBox::paintEvent(QPaintEvent *) で好きなように描画します。(ソース参照)