시그널

프로그램 사용자가 마우스로 클릭하거나 마우스를 이동, 또는 키보드를 입력하는 것 모두 프로그램이 받아서 처리해야할 내용들입니다. 이것은 마치 사용자가 프로그램에 어떻게 하라는 지시와 같은 것이므로 이와 같은 지시를 시그널(signal)이라고 합니다.

우리가 폼에 버튼이나 라벨같은 위젯을 배치하기 때문에 폼 만이 윈도우 같지만 사실, 버튼이나 라벨 모두 윈도우입니다. 그러므로 윈도우가 사용자의 신호를 받을 수 있는 것처럼 버튼이나 라벨도 사용자의 신호, 즉 시그널을 받을 수 있습니다.

슬롯

시그널을 받았으면 해당되는 일을 처리해야 되는데, 시그널에 따라 처리하는 내용을 슬롯이라고 합니다. 슬롯이라고 특별한 것은 없습니다. 컴퓨터 프로그램에서 어떤 일을 처리하도록 작성한 것은 곧 함수입니다. 그렇습니다. 이전 "QT - 슬롯" 강좌에서 말씀드린바와 같이 슬롯도 어떤 일을 처리하기 위한 함수이며, 객체 안에 포함된 멤버함수일 뿐입니다.

다만 특이하다면 특정 시그널과 직접 연결될 수 있다는 점이 되겠습니다.

디자이너의 자동화가 만능?

뭐, 다 아는 야그를 이렇게 길게 적느냐 하실지 모르겠습니다만, 정작 오늘의 글은 시그널과 슬롯을 정의하기 위해 작성되는 글이 아닙니다. 대신에,

과연 QT 디자이너의 편리한 자동화(?) 기능이 만능일까?

자동화 기능이란 QT와 어울리지 않지만 제가 단어 실력이 딸려서 억지로 사용했습니다. ^^;

이전 강좌에서 계속 보여 드렸듯이 QT 디자이너를 이용하면 프로그램 코드를 손으로 입력해 주어야 할 것을, 마우스로 몇 번 클릭해 주면 작업이 완료되는 아주 편리한 자동화 기능이 잇습니다.

예로 버튼 clicked() 시그널과 폼의 close() 슬롯을 연결한 것 입니다. 이전 강좌의 내용을 잠시 보겠습니다. 지금 마우스로 버튼의 시그널과 폼의 슬롯을 연결하려 합니다.

그리고 역식 마우스로 버튼의 clicked() 시그널과 폼의 close() 슬롯을 연결합니다.

이렇게 마우스만으로 시그널과 슬롯을 연결했습니다만 실제 내부에서는 프로그래머가 직적 아래의 코드를 입력하듯 만들어졌을 것입니다.

connect( btn, SIGNAL( clicked()), this, SLOT( close()));

만능이 아니다!!

여기까지는 별로 문제가 없어 보입니다. 그러나 문제는 위의 "View and Edit Connection" 윈도우에서 QT 위젯들의 섬세한 부분을 모두 사용할 수 없다는 점입니다.

예로 이런 프로그램을 작성해 보겠습니다. 라벨(labSample) 한 개와 버튼 2개( btnShow, bntHide)를 두고, btnShow를 누르면 labSample가 보이고, btnHide를 클릭하면 감추도록 하겠습니다.

이미, labSample 즉, QLabel에는 show()와 hide() 슬롯이 준비되어 있습니다. 그러므로 역시 QT 디자이너에서 간단하게 작성할 수 있을 듯 한데, 이게 안 됩니다.

보시면 아시겠지만 show()나 hide() 슬롯이 선택 목록에 나오지 않습니다. 그럼 어떻게 해야 할까요?

그러면 해결 방법은?

디자이너에서 제공되는 기능만으로 디자인한다면 setShown() 슬롯을 이용하면 됩니다. 대신에 버튼의 SIGNAL은 clicked()가 아닌 toggled()를 사용해야 하고, 버튼 속성 중에 toggleButton을 true로 설정해야 합니다. 이것은 속성 그대로 toggle 버튼이므로 버튼 2개가 아니라 버튼 하나로 처리하는 모습이 됩니다.

그러나 뭐, QLabel을 감추거나 숨기는 방법을 알려는 것이 아니라 디자이너에서 이미 있는 슬롯을 사용하지 못한다라는 것이 이 글의 주제입니다.

제가 생각한 방법은 init() 함수에서 직접 connect() 함수를 사용하여 버튼의 시그널과 라벨의 슬롯을 연결해 주는 것입니다.

즉,

void frmMain::init()
{
   connect( btnShow, SIGNAL( clicked()), labSample, SLOT( show()));
   connect( btnHide, SIGNAL( clicked()), labSample, SLOT( hide()));
}

무엇을 말하고 싶은 것인가?

QT 디자이너가 편리하지만 역시 Document를 애용해야 겠다는 말씀을 드리고 싶습니다. 가령 위와 같은 문제를 맞났고 버튼 2개로 처리해야 한다면 아마도 폼에 슬롯을 만들고 그 슬롯을 이용하여 라벨을 감추거나 보이게 하는 코드를 넣어야 했을 것입니다.

그러나 Document에서 QLabel의 슬롯을 확인했다면 connect()함수로 간단히 해결할 수 있다는 것이죠.

QLabel은 QFrame에서 상송 받았고, QFrame는 다시 QWidget를 상속 받았습니다. QWidget는 아래의 슬롯을 가지고 있습니다. 이 모든 것을 다 외울 수는 없지만 필요한 슬롯이 있을 때, 디자이너에서 없다고 실제 없는 것으로 생각하지 않고, Document에서 직접 검색해 봐야 겠습니다.

 

태그: *QT *그래픽