QT5 Lambda Signal & Slot

Standard

QT 를 처음 개발하면서 여러 개발 문서들을 보았지만, 역시나 4 버전대의 문서가 많았다. 이건 나만의 공부 방법이니 태클은 없었으면 좋겠다.

그렇게 개발을 진행을 하였으나 기능상의 제약이 많았다 특정 시그널에 (여러 파라메터를 넘기고 싶다거나..) 하여 문서를 다시 정독 하였다.

특징적으로 QT 4와 QT 5 에서 시그널의 방식은 변해있었다.

지금 부터 알아보자.

위와 같이 sender 와 reciver 에 해당하는 signal 과 slot 을 사용하여 작성된다.

본인이 직접적으로 만들어서 사용을 해도 해당 SIGNAL 이 발생 될시 SLOT으로 여러 파라메터를 넘길 수 있지만 사실상 SIGNAL 과 SLOT 을 제대로 사용을하려면 여간 번거롭고 귀찮은 것이 아니다.

 

그러면 QT5 에서 새로 추가된 SIGNAL & SLOT을 보자

쉽게 생각해서

connect(main, SIGNAL(clicked()) , this , SLOT(PPP());  가 connect(main, &MainClass::clicked, this, &MainClass::PPP) 가 되는것이다.

처음에 이 문법을 보았을땐 대체 무엇이 바귀고 왜 저렇게 써야 했는진 잘 몰랏지만 알아 본바는 다음과 같다.

새로운 문법은 컴파일 시간을 체크 할 수가 있고, 또한 그둘의 타입이 다르더라도 자동으로 인자들을 변환 할 수있고 C++11 인 Lambda 식을 추가 지원을 한다는 것이다.

자 이런 의도로 인해 새로운 문법이 나온 것이다.

이건 여간 편한점이 아닐 수 없다.

내가 정말 편하게 사용했던 Lambda 식으로는 정말 최강이었다. 구구절절 말보다는 코드를 실질 적으로 보자.

 

위 SIGNAL & SLOT 은 다음과 같다. treeView 에있는 header 를 클릭시 오름차순 내림 차순 정렬을 하는 기능이다.

여러가지 방법이야 있겠지만 간단하게 Lambda를 사용하여 SLOT을 또다시 만들지 않고 사용을 할 수가 있다.

Signal 중 sortIndicatorChanged(int,Qt::SortOrder) 을 Lambda로 인자 그대로 받아 들어왔고 Closer 를 사용하여 외부에있는 객체 자체를 가져와 바로 사용을 할 수가 있다.

즉 굳이 Slot을 사용하기 위해서 Slot을 만들지 않아도 Closer 로 인해 직접적인 호출및 작업을 할 수가 있다.

처음에 알았더라면 조금더 편하게 작업을 했을텐데 많이 아쉽다.