スタイル対応ウィジェットの作成
スタイル対応ウィジェットは、描画されるスタイルに準拠します。フレーム、ボタン、インジケータを自身で描画するのではなく、現在のスタイルにそれらの描画を依頼し、コンテンツのレイアウトに必要なメトリクスもスタイルから取得します。 その結果、このウィジェットはどのプラットフォームでもネイティブのように見え、アプリケーションのカラーパレットに従い、Qt Widgetsのウィジェットと同様にカスタムスタイルやスタイルシートを適用します。
スタイルオプションの構築
スタイルは `QStyleOption` 内の情報に基づいて描画を行うため、ペイントイベントにおける最初のステップは、このオブジェクトを初期化することです。描画したい要素に一致するオプションクラスを選択し、QStyleOption::initFrom() を呼び出して、すべてのウィジェットに共通する状態フラグ、矩形、パレット、およびフォントメトリックを設定した後、その要素に固有のメンバーを設定します。
Qt Widgetsのウィジェットでは、これをprotected virtualinitStyleOption() 関数内で実行しており、これによりサブクラスでオプションを調整できるようになっています。ご自身のウィジェットでも同様のパターンに従ってください。
スタイルを介して描画する
QStyle の描画関数を使用して、オプション、QPainter 、およびウィジェット自体を引数として渡し、要素を描画します。
QPainter painter(this);
...
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);QStylePainter は、QStyle 、QPainter 、およびQWidget を組み合わせたものです。その描画関数は要素とオプションのみを受け取るため、コードを簡潔にできます:
QStylePainter painter(this);
...
painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
自分で描画する色には、オプション内のパレット、または `QWidget::palette()` を使用してください。そうすることで、ウィジェットはアプリケーションのパレットに従い、ライトおよびダークの両方のカラースキームで動作します。
サイズについてはスタイルを参照する
sizeHint() およびminimumSizeHint() は、スタイルに基づいて実装してください。sizeFromContents() は、指定されたコンテンツタイプに対して、コンテンツのサイズをウィジェットのサイズに変換し、pixelMetric() は、スタイルのフレーム幅、マージン、およびインジケーターのサイズを返します。位置を独自に計算する代わりに、subElementRect() を使用して、スタイルが要素の各部分をどこに配置するかを取得してください。
ウィジェットの状態を報告する
スタイルは、状態フラグが設定されている場合にのみ、ホバーおよびフォーカス効果を描画します。ホバーイベントを受信するには、ウィジェットにWA_Hover 属性を設定し、マウスが要素の上にある間はState_MouseOver をオプションに追加します。ウィジェットが押されている間はState_Sunken を設定し、チェック可能な要素についてはState_On 、State_Off 、またはState_NoChange を設定します。『ウィジェットスタイルリファレンス』には、各要素が期待するフラグが一覧されています。
スタイルおよびパレットの変更を追跡する
アプリケーションのスタイルやパレットが変更されると、ウィジェットはchangeEvent()内でQEvent::StyleChange またはQEvent::PaletteChange イベントを受信します。サイズヒントがスタイルに依存する場合は、そこでキャッシュされたメトリックを無効化し、updateGeometry()を呼び出してください。
右から左へのレイアウトのサポート
右から左へのレイアウトでは、スタイルによって非対称な要素が反転表示されます。visualRect() を使用して矩形を論理座標から画面座標に変換し、visualAlignment() を使用して配置を反転させ、オプションのdirection をスタイルに渡してください。-reverse コマンドラインオプションを使用してテストしてください。
QStyle 、QStylePainter 、QStyleOption 、「スタイルによるウィジェットの描画方法」、および「ウィジェット・スタイル・リファレンス」も参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.