구현 해야 할 UI는 리스트 위젯이다. 그런데, 그림에서 보면 일단 버튼이 보인다.
그럼 리스트 위젯이 아닌, 리스트 위젯과 유사한 QTableWidget을 사용하여 구현한다.
- 테이블의 row hover
- 윈도우 크기에 따른 테이블 row의 삽입 / 삭제 기능
- 실제 클릭할 row는 5개 이고, 그 외의 row에 대해서는 어떠한 이벤트도 발생하지 않는다.
[1] 테이블의 Row Hover 기능
- 기본적인 Table 위젯의 기능 외에 추가적으로 구현 해야하는 기능은 위와 같다. Row열에 대한 Hover 기능을 어떻게 구현해야 할 것인가? QTableWidget에는 Item에 대한 Hover 기능은 있지만, Item의 Row에 대한 hover 기능은 없는 듯 하다. (Selection Row는 있는데..) 그래서 직접 구현해야 한다. ㅠ_ㅠ
호버 이벤트가 발생되는 signal을 캡쳐하여, Row에 대한 hover 이벤트가 발생되도록 한다.
- void itemEntered(QTableWidgetItem * item) 라는 signal 에 대해서 row hover 이벤트가 발생되도록 한다.
- 버튼은 tableitem의 cellwidget으로 구현해야 한다. 그렇기 때문에, 버튼에 대해서는 itemEnter이벤트가 발생되지 않으므로,
해당 버튼의 enterEvent를 통해서 hover이벤트를 전달한다.
[2] 윈도우 크기에 따른 테이블 row의 삽입 / 삭제 기능
- 위 그림 처럼 보이기 위해선 실제 row를 삽입해야만 위 처럼 보일 수 있다. Table Widget의
ResizeEvent를 override 하여 크기에
따라서 row를 삽입 / 삭제 할지를 판단해야 한다.
[3] 실제 클릭할 row는 5개 이고, 그 외의 row에 대해서는 어떠한 이벤트도 발생하지 않는다.
- 그림처럼 row가 보일려면 실제 row를 삽입해야만 하고, 존재하는 row이므로, 선택은 반드시 되게 되어 있다. 그럼 이것을 어떻게 우회 할 수 있을까?! 처음에는 선택시, 해당 row > 5 는 조건일 때, 해당 이벤트를 무시하도록 했으나, 언제나 그렇듯 한방에 되지는 않는다. 그렇다면? QTableWidget의 선택모드를 강제로 비활성화 하고, MousePressEvent는 HoverEvent가 발생한 뒤 발생하는 것이므로, Hover시 현재 row에 대해서 선택 가능 상태를 판단하고, MousePressEvent에서 hover된 row를 선택 하도록 한다.
[4] 삭제 기능시 cellwidget의 정의된 아이템이 visible이 true가 되는 상태.
- Hover시에만 삭제 버튼이 보여서 클릭이 가능하다. 처음 시도한 방법은 cellWidget의 visible 상태를 변경하는 것이였다.
그러나, removeRow만 하면, cellWidget이 살아나는 것이다. 심지어 removeRow 후에 다시 상태를 변경해도 변경이 되지 않았다. 결국 setVisible 상태 변경으로 위 문제를 해결하기는 힘들었다. 과연 방법은 무엇일까?! TableWidget을 Qwidget으로 완전 새로이 만들 수도 있지만, 결국 난 상태에 따라서 버튼의 visible 상태만 변경하면 되므로, styleSheet 상태를 변경하는 것을 선택하였다.
기본 UI
- 마우스 우클릭시 row 에 대해 삽입/삭제가 가능하다.
- 삽입은 순차적으로 되며, 삭제는 현재 row에 대해서 삭제한다.
- 0번째 row는 선택 상태이며,
- 2번쨰 row는 호버 상태이다. 호버 상태에서만 x 버튼이 활성화 된다.
- 3번 이후 row에 대해서는 선택할 수 없다.
- Resize 커졌을 때와 resize 작아졌을 때의 모습이다.
- 미세조정이 필요하나, 실제 개발버전에서나 미세조정하여 적용하고, 위 처럼 기능 구현을 하면 된다.
Binary : https://drive.google.com/open?id=0ByvWiBJz6HrFcGRxb3RCWkxSYUU
Source : https://github.com/holograming/QtDevZone/tree/master/Src/TableWidget
[*] "선택할 수 없게 만든 다음, 강제로 내가 선택된거 처럼 만든다."
개발 기간 5일, 위 기능을 개발하면서 refresh 되는 기분을 느낄 수 있었다.
1-2틀 고민하면서 해결하지 못했던 부분이 선택할 수 없는 영역에 대해서 선택하지 못하도록 하는것에 대한 방법을 찾는 것이였다.
위 기능에 대해 Devman에게 조언을 구했고, devman이 해당 기능에 대해서 위와 같이 마무리 해줬다.
만일 나였다면, 어떻게 했을까 생각을 해본다면, 안된다고 포기하고 QTableWidget을 사용하지 않고, 해당 기능처럼
동작하는 QWidget과 QLayout들을 사용하여 직접 구현했을 것이라고 생각이 들었다.
위같은 방법으로도 할 수 있다는 것에 기분전환이 되었고, 도움을 준 devman에게 고맙다. ㅋㅋㅋㅋ
댓글 없음:
댓글 쓰기