페이지

Include Lists

2017년 8월 2일 수요일

선택할 수 없는 영역이 있는 TableWidget 만들기




 What
   - 선택할 수 없는 영역의 있는 TableWidget

 Usage
   - QTableWidget을 재정의하여 개발



   

  
구현 해야 UI 리스트 위젯이다. 그런데, 그림에서 보면 일단 버튼이 보인다.
그럼 리스트 위젯이 아닌, 리스트 위젯과 유사한 QTableWidget 사용하여 구현한다.

  1. 테이블의 row hover
  2. 윈도우 크기에 따른 테이블 row 삽입 / 삭제 기능
  3. 실제 클릭할 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 작아졌을 때의 모습이다.
  • 미세조정이 필요하나, 실제 개발버전에서나 미세조정하여 적용하고, 처럼 기능 구현을 하면 된다.


[*] "선택할 없게 만든 다음, 강제로 내가 선택된거 처럼 만든다."
     개발 기간 5, 기능을 개발하면서 refresh 되는 기분을 느낄 있었다.
     1-2 고민하면서 해결하지 못했던 부분이 선택할 없는 영역에 대해서 선택하지 못하도록 하는것에 대한 방법을 찾는 것이였다.
     기능에 대해 Devman에게 조언을 구했고, devman 해당 기능에 대해서 위와 같이 마무리 해줬다.
     만일 나였다면, 어떻게 했을까 생각을 해본다면, 안된다고 포기하고 QTableWidget 사용하지 않고, 해당 기능처럼
     동작하는 QWidgetQLayout들을 사용하여 직접 구현했을 것이라고 생각이 들었다.
     위같은 방법으로도 있다는 것에 기분전환이 되었고, 도움을 devman에게 고맙다. ㅋㅋㅋㅋ