이 페이지에서

스타일 인식 위젯 작성하기

스타일 인식 위젯은 그려지는 스타일을 따릅니다. 프레임, 버튼, 표시기를 직접 그리는 대신, 현재 스타일에 이를 그리도록 요청하고, 내용을 배치하는 데 필요한 측정값을 스타일에서 가져옵니다. 그 결과, 이 위젯은 모든 플랫폼에서 네이티브처럼 보이며, 애플리케이션 팔레트를 따르고, Qt Widgets 자체 위젯과 마찬가지로 사용자 정의 스타일이나 스타일 시트를 적용합니다.

스타일 옵션 생성

스타일은 ` QStyleOption`에 포함된 정보를 기반으로 렌더링되므로, 페인트 이벤트의 첫 번째 단계는 이 객체를 채우는 것입니다. 그릴 요소에 맞는 옵션 클래스를 선택하고, ` QStyleOption::initFrom()`를 호출하여 모든 위젯이 공유하는 상태 플래그, 사각형, 팔레트 및 글꼴 메트릭을 설정한 다음, 해당 요소에 특정한 멤버를 설정하십시오.

Qt Widgets의 위젯들은 이를 ` initStyleOption() `의 보호된 가상 함수에서 처리하므로, 하위 클래스에서 옵션을 조정할 수 있습니다. 여러분의 위젯에서도 동일한 패턴을 따르십시오.

스타일을 통해 그리기

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);

QStylePainter가 QPainter를 상속받는 것을 보여주는 다이어그램

직접 색상을 그릴 때는 옵션 내의 팔레트나 ` 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.