페이지

2016년 3월 18일 금요일

pvdevelop 프로젝트 -UI 편집 방법 - ComboBox 위젯 사용법

콤보박스 사용은 한번도 해본 적이 없다.
본인이 어떤 식으로 사용해 본 적이 없는 위젯에 적응하는지 한번 살펴보기 바란다. 유사한 방법을 사용하면 아마 모든 위젯을 본인이 직접 사용할 수 있을 것이다.

GUI 작화는 그림 1과 같이 직접 작업하시기를

그림 1. 콤보박스 위젯 추가

combo_01을 이름으로 지정하고 콤보박스 위젯을 하나 만든 후 서버를 실행한 후 pvbrowser에서 확인하면 그림2와 같이 나타날 것이다.

그림 2. 콤보박스 위젯 실행화면
콤보 박스를 마우스로 눌러보기 바란다. GUI 화면에서는 반응이 없다. 어라...
하지만 서버 메시지 창을 살펴 보면 그림 3과 같이 열심히 반응하고 있다.

그림 3.서버메시지 창
발생하는 이벤튼 모두 마우스 클릭 동작과 연관된 것들 뿐이다. 어떻게 사용하지...

고민하지 말고 에디터 화면 좌측에 있는 Insert Function 버튼을 눌러 pvQComboBox 에서 지원하는 함수들을 한번 살펴보자. 다른 위젯 들과 중복되는 것은 제외하고.

  • pvClear(p, id)
  • pvInsertItem(p, id, "file.bmp", "text");
  • pvRemoveItem(p, id, index);
  • pvRemoveItemByName(p, id, "name");
  • pvSetCurrentItem(p,id,index);

우선은, 이 5개의 함수가 눈에 들어온다.

정황상 콤보박스 위젯에 Item을 넣어주어야 할 것 같다. 함수 이름으로 볼때 pvInsertItem() 함수를 이용하면 될것 같다. 테스트 해보자. slotInit() 함수에서 다음과 입력하여 item을 입력하자.

pvInsertItem(p,comb_01,,"Korea");

수정된 코드는 다음과 같다.


에디터 모드에서 make 하니 다음과 같은 에러가 발생한다.

error:expected primary-expression before ',' token pvInsertItem(p, combo_01,,"Korea");

인자를 공백으로 하면 않되는 것 같다. NULL 값을 넣어주자.

pvInsertItem(p,comb_01,NULL,"Korea");

다시 make를 수행하자. 이런 제길 에러가 또 발생한다. 이번에는 다른,... 에러의 종류가 틀리다.

warning:converting to non-pointer type ....

왜 이럴까. 이럴때는 헬프 메뉴를 이용해 메뉴얼을 찾아 보는것이 상책이다. 함수의 정의가 틀리네, 인자의 수가 2개나 더 많다

 % 일반적 pvfunction 관련 함수는 pvslib에 정의 되어 있다. 헬프창에서 pvslib를 누르면 ProvessViewBrowser-ServerProgramming 이라는 화면으로 전환된다. 화면 중간, 오른쪽에 있는 서치에 찾고자하는 함수이름을 넣어주면 함수에 대한 자세한 설명이 나타난다...OTL... 하지만 이 것 만이라도 감사한다.

아래와 같이 pvInsertItem() 함수가 정의 되어 있다.



이런 재길, 만약 아이콘용 bmp_file을 사용하지 않을 경우 NULL을 입력하라는 상세한 설명과 함께 Insert Function 버튼을 눌러 삽입되는 것과 틀린 정의가 있다. 수정하자. 하라는 데로 하는 것이 신상에 이롭다.

pvInsertItem(p, comb_01, -1, NULL, "Korea");

index에 -1을 넣은 것은 자동으로 인덱스를 부여하라고 한 것이다.

에디터 모드에서 Make를 수행하면 에러 없이 컴파일 된다. 자 서버를 실행한 GUI 화면을 확인해보자.

그림 4. GUI 실행 화면
콤보 박스를 누르면 그림 4와 같이 나타난다.

아이템을 한개만 집어넣으면, 콤보 박스를 사용할 의미가 없다. 더 추가하자.




서버 실행 후  pvbrowser에서 콤보 박스를 누르면 아래와 같이 나타난다. 네개의 항목이 제대로 들어가 있다. 현재 선택된 것은 USA...

그림 5. GUI 실행화면
그럼 콤보 박스를 누르거나, 콤보 박스 항목을 선택하면 무슨 이벤트가 발생하는 지 확인해 보자.

그림 6. 서버 메시지 창
별 이벤트가 없다. 콤보 박스를 선택하면 마우스 이벤트, 콤보 박스 항목을 선택하면TEXT 이벤트가 발생하면서 콤보박스에 표시되는 내용이 바뀌는 것 밖에는...


버튼을 하나 만들어 선택된 아이템을 삭제하는 구문을 한번 작성해 보자. 눈치 빠른 분들은 이 인간 pvRemoveItemByName(),pvSetCurrentItem() 이 두 함수를 사용하겠지 생각할 거다. 정답이다. 추가적으로 콤보박스에 선택된 아이템을 제거하기위한, 전용 버튼을 하나 만들어 코드를 작성해 보자.

간단하게 보이지만...
우선 DATA 구조에 변수 2개를 새로 만들자. 현재 콤보박스 항목을 기억하기 위해 필요하다.



다음은 slotInit() 함수 구문을 조금 손대자.



콤보 박스의 선택값을 Korea로 하기 위해 pvSetCurrent() 함수를 사용하였다.

다음은 콤보 박스의 선택값이 변경되었을 때 변경된 값이 어떤 것인지 항상 기억하기 위해 TEXT_EVENT가 발생하였을 떄 d->comboID, d->comboText를 변경하는 구문을 넣어주자.




리턴 문 앞에 있는 구문을 이용하여 현재 아이템의 이름을 항상 기억하도록 하였다.

자, 푸시 버튼을 눌렀을 때 아이템을 삭제하기만 한다.




리턴 문 앞에 있는 코드 만 확인하자.

그림 7. GUI 실행 화면

아이템 중 Japan을 삭제하였다. 잘 작동한다.

사실 d->comboID 정수형 변수를 쓸모 가 없다. 어찌보면 하는 일 없이 메모리만 차지하고 있을지 모르지만, 아이템의 내용이 아닌 숫자가 필요할 수 도 있기 때문에 코드에 넣어 주었다. 정확하게 사용하기 위해서는 TextEvent가 발생하였을 때 문자열만 복사하는 것이 아니라, 해당 문자열을 확인하여 d->comboID 값도 함께 변경시켜 주는 코드를 작성하면 더 유용하게 사용할 수 있을 것 같다.

콤보 박스의 모든 내용을 삭제하고 싶다면 pvClear()함수를 사용하면된다. 테스트는 직접 해보기 바란다.

 본인이 처음 접하는 위젯의 사용법을 어떻게 알아내고, 어떤 방식으로 사용하는지 콤보 박스를 이용하여 기술해 보았다. 이 방법이 정확한 방법은 아니지만... 아마 보다 더 편한 방법이 있을 것이다. 그러나 자료가 부족한 본인의 입장에서는 아직 이 방법이 최선의 방법이다.

시간이 되면 pvserver 헬프 메뉴에 있는 함수들의 소스 코드도 함께 살펴보기 바란다. 지식이 짧아 아직은 조금 밖에 이해가 되지는 않지만, 많은 도음을 얻을 수 있다. 아.... 난, 언제 이런 코드 한번 작성해 볼 수 있을까....OTL...

댓글 없음:

댓글 쓰기