Qt에서 기본으로 제공하는 위젯 중에서 toggle switch는 없다.
그래서 새로 만들어보기로 했다!!
토글 스위치를 on/off 용도로만 사용할껀 아니고 2개의 옵션이 있을 때도 사용할 수 있게 만들기로 했다.
그래서 버튼 좌,우측에 label을 넣었다.
(지금 캡쳐가 갑자기 안되가지고.. 나중에 캡쳐이미지 넣어야겠다)
마우스 이벤트 따로 처리해줄껀 없고, QPushButton의 checked, unchecked상태에 따른 icon만 수정해주면 된다!
쉬워보였는데 여기서 의외의 복병을 만났다.
어려웠던 점
QPushButton에서 기본으로 제공하는 스타일이 있다.
checkable(true)로 설정하고 checked 상태일 때는 테두리가 dotted로 되고, icon이 눌린 느낌을 주기위해 위치가 아래로 약간 움직인다.
이 기본 스타일을 없애고 싶어서 애먹었다.
나와 똑같은 고민 : www.qtcentre.org/threads/33308-Removing-pressed-effect-from-a-QPushButton
Removing pressed effect from a QPushButton
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.
www.qtcentre.org
구글링해도 안나오고 내가 CSS를 잘 몰라서 진짜 시간 많이 들였다,,, 휴
정작 해결 코드는 엄청 간단함.
button->setStyleSheet("QPushButton{ border: none; outline: none; padding: 0px}");
위의 문제에서 느낀점
위의 문제를 해결하면서 느낀건 진짜 "집념"이다 ㅋㅋㅋㅋㅋ
평소였으면 조금 해보다가 포기하고 아예 내가 아는 방식으로 코드를 수정했을 것 같다.
여기서 내가 아는 방식이란 -> QPushButton 자체를 사용하지 말고 QWidget에서 setChecked, isChecked 이런거 일일이 구현하고, paintEvent에서 직접 pixmap 그려주면 됨.
근데 이번에는 방식을 바꾸지 않았다!! (이게 중요하지! 아암 그러엄)
그리고 하루종일 css 수정해보고 ui바뀌는 거 확인해보는 테스트만 해봤다 ㅋㅋㅋ
사실 문제 자체는 정말 사소했지만 나에게 느낀점은 크게 다가왔다.
깨달음1. 역시 코딩 세계에서 안되는 건 없다는 점과 (되는 것/내가 못하는 것 2개만 있는 듯)
깨달음2. 집념이 코딩 잘하는 방법이라는 점
재밌는 미션
위의 위젯을 구현할 때 paintEvent()함수를 삭제해보라는 수석님의 미션(?)이 있었다.
처음에 위젯을 만들고 수석님께 코드 리뷰를 받았다.
수석님은 내 코드를 보시고 paintEvent에서 버튼의 checked, disable 상태에 따라 아이콘을 바꿔주는 부분이 비효율적이라고 하셨다.
paintEvent는 checked상태와 별개로 계속 호출되는 함수니까..! 그래서 한번 지워보라고 미션(?)을 주었다.
paintEvent를 이용하는 것이 비효율적이라는 사실은 너무나 자명한 사실인데 내가 한번도 고려하지 않고 코드를 짰다는게 스스로 너무 아쉬웠다!!!!!!
다른 코드들에서 paintEvent에서 이미지를 그려주고 있으니까 생각없이 코드를 복사해와서 구현한 것이다.
이건 진짜 고쳐야하는 안좋은 습관!
코딩할 때 복사해오더라도 꼭 더 좋은 방법은 없는가 고민해보기!!
결국 paintEvent 함수를 삭제하고 이렇게 수정했다.
버튼의 hover에 따른 배경색 칠하기 -> stylesheet
버튼의 pressed에 따른 배경색 칠하기 -> stylesheet
버튼 스위치 왼쪽오른쪽 아이콘 변경 -> qpushbutton의 clicked(bool)시그널이 올때 아이콘 변경해주기
코딩이 즐거운 순간
위의 위젯을 다 구현하고 너무너무너무X100 기분이 좋았다.
77ㅑ 코딩 짜릿해!
평소에 설계방식과 전혀 다른 방식을 시도했고, 그 방식이 군더더기 없이 구현되어서 스스로 너무 만족스러웠다.
새로운 방식의 설계가 코드 라인도 훨씬 적고, Qt에서 제공하는 stylesheet와 pushbutton을 사용하니까 직접 구현해줄 부분도 적었다. 즉 유지보수도 쉬울꺼라는 말!
내가 코딩이 즐겁다고 느끼는 순간은 '고뇌하여 문제를 겨우 해결했을 때'만인줄 알았는데 그거 말고도 더 많은 순간이 있는 것 같다.
지금처럼 스스로의 코드가 만족스러울 때, 새로운 방식을 익혔을 때(성장을 느낄 때)도 있다.
아 그리고 문제 해결에서 '해결'을 어떻게 정의하냐도 다름
그냥 버그를 잡고 원하는 시나리오대로 동작하는 것은 if else로 다 해결할 수 있는데 그걸 어떻게 효율적으로 푸는지가 키포인트다! 그 부분이 재미있다!!