Programming

[Qt4] Signal 과 Slot

라우드니스 2010. 9. 12. 20:30

간단 요약 : Qt에서 객체 끼리 서로 연결해 주는 것

트롤테크의 공식 Qt 가이드 북을 보면 초반에 배우는 Qt의 특별한 기능 중 하나가 바로 Signal 과 Slot 입니다.

학교 과제용으로 프로그램을 만들때 처음으로 Qt를 사용해 보면서 그리 특별한 기능은 아니라 생각하고 책을 읽었던 적이 있었는데 결과는...  결국 처음 시그널와 슬롯부터 천천히 읽어나가게 되었습니다.


시그널과 슬롯이 뭐냐하면, 아주 간단한 예를 들어 이 글을 쓰고 있는 입장에서 글 올리기 버튼을 누르면 특정한 함수가 실행되어서 화면이 넘어가고 글이 저장될탠데요. 이 글 올리기 버튼과 글이 저장되는 특정한 함수를 서로 연결 시켜주는것이 시그널과 슬롯입니다.


시그널과 슬롯은 하는 역할은 굉장히 간단헤서 무시해도 될 것 같지만 시그널과 슬롯이 없다면 GUI관련 클래스의 특정 함수에 다른 현상을 연결시키려면 그에 맞는 상황을 매번 제작 할 수 밖에 없는 노릇입니다 또 Seekbar의 게이지와 해당 게이지를 얻는 변수의 값도 게이지가 변할 때마다 인식할 수 있는 어떠한 함수도 필요하죠. 이런 것을 쉽게 연결시켜주는 것이 시그널과 슬롯으로 Qt프로그래밍 내내 굉장히 편리한 기능이 되어줍니다. 



사용법은 

connect 라는 함수에 a,b,c,d 라는 4개의 파라메터가 들어갑니다.


connect(a,b,c,d)

파라메터의 역할은 a 에 b 시그널이 일어났을때 c 에 d 슬롯을 실행시킨다 입니다.
signal과 slot은 정해져있거나, (예 : QPushButton 의 clicked() signal) 클래스 선언 시 제작하시면 됩니다.
또 signal -> slot 만 가능한게 아니라 signal -> signal 도 가능합니다.

의미는 a 에 b 시그널이 일어났을때 c 에서 d 시그널을 일으킨다 가 됩니다.
간단한 프로그래밍 시에 주 사용용도는 widget이나 window 끼리 연결할때 사용됩니다.


ex) connect(&hello, SIGNAL(clicked()), &app, SLOT(quit()) )

hello의 clicked 함수가 호출 됬을때 app의 quit함수를 호출한다.


ex) connect(notRsRead, SIGNAL(activated(int)), this, SLOT(onReceiveFromRs232()))


사용자 signal,slot 설정.


class TripPlanner : public QDialog, public Ui::TripPlanner

{

    Q_OBJECT

public:

    TripPlanner(QWidget *parent = 0);

signals:

    //원하는 시그널 함수 선언.

private slots:

    //원하는 슬롯 함수 선언.

    void connectToServer();

    void sendRequest();

    void updateTableWidget();

    void stopSearch();

    void connectionClosedByServer();

    void error();

private:

    void closeConnection();

    QTcpSocket tcpSocket;

    quint16 nextBlockSize;

};

 signals:과 slots: 은 메크로로 컴파일러가 알아서 처리하기 때문에 신경쓸 필요 없습니다.

반응형