Qt4 와 Qt5 의 신호 와 슬롯 의 사용 차이

5876 단어 Qt4Qt5시그 널홈.
요약:Qt4 와 Qt5 의 신호 와 슬롯 의 연결 connect 와 disconnect 의 차이 점
GUI 인터페이스 란 결국 구성 요소 의 중첩 이다.우 리 는 창 을 만 들 고 단 추 를 위 에 놓 고 아이콘 을 위 에 놓 으 면 인터페이스 가 된다.배치 할 때 구성 요소 의 위치 가 특히 중요 합 니 다.창 이 필요 한 방식 으로 렌 더 링 할 수 있 도록 구성 요 소 를 어디 에 두 어야 합 니까?이것 은 구성 요소 의 포 지 셔 닝 메커니즘 과 관련된다.Qt 는 두 가지 구성 요소 포 지 셔 닝 체 제 를 제공 합 니 다.절대 포 지 셔 닝 과 레이아웃 포 지 셔 닝 입 니 다.
말 그대로 절대적 인 포 지 셔 닝 은 가장 원시 적 인 포 지 셔 닝 방법 이다.이 구성 요소 의 좌표 와 너비 값 을 제시 하 는 것 이다.이렇게 하면 Qt 는 구성 요 소 를 어디 에 두 어야 하 는 지,구성 요소 의 크기 를 어떻게 설정 해 야 하 는 지 알 수 있 습 니 다.그러나 이렇게 하 는 문 제 는 사용자 가 창 크기 를 바 꾸 면 최대 화 단 추 를 누 르 거나 마 우 스 를 사용 하여 창 가장 자 리 를 끌 면 절대 포 지 셔 닝 구성 요 소 를 사용 하면 아무런 응답 이 없다 는 것 이다.이것 도 자 연 스 럽 습 니 다.Qt 에 게 창 이 변 할 때 구성 요소 가 자신 을 업데이트 하고 어떻게 업데이트 하 는 지 알려 주지 않 았 기 때 문 입 니 다.구성 요 소 를 자동 으로 업데이트 시 켜 야 한다 면-이것 은 흔히 볼 수 있 는 수요 입 니 다.예 를 들 어 최대 화 할 때 Word 는 항상 원고지 구역 을 확대 하고 도구 모음 을 길 게 늘 려 야 합 니 다.-해당 하 는 함 수 를 만들어 서 이러한 변화 에 응답 해 야 합 니 다.또는 더 쉬 운 방법 도 있 습 니 다.사용자 가 창 크기 를 바 꾸 는 것 을 금지 합 니 다.하지만 장기 적 인 계획 은 아니다.
이러한 변화의 수요 에 맞추어 Qt 는 또 다른 메커니즘 인 구 조 를 제공 하여 이 문 제 를 해결 했다.구성 요 소 를 특정한 레이아웃 에 넣 으 면 레이아웃 은 전문 적 인 레이아웃 관리자 가 관리 합 니 다.크기 나 위 치 를 조정 해 야 할 때 Qt 는 해당 하 는 레이아웃 관리 자 를 사용 하여 조정 합 니 다.

신호 와 슬롯 의 connect
Qt4 방식:매크로

//Qt4:  
/* 1*/  static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
/* 2*/         QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
Qt5 방식:함수 포인터

// Qt5:     
/* 3*/  static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
/* 4*/  static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)   
/* 5*/  static QMetaObject :: Connection QObject :: connect(const QObject * sender, const QMetaMethod&signal,const QObject * receiver, const QMetaMethod& method,Qt :: ConnectionType type = Qt :: AutoConnection)
connect 다섯 번 째 매개 변수
type:신호 와 슬롯 의 연결 방식 을 가리 키 는 데 사 용 됩 니 다.신 호 를 즉시 한 슬롯 으로 전송 할 지,아니면 잠시 후에 줄 을 서서 전송 을 기다 릴 지 결정 합 니 다.관련 방식 은 매 거 진 Qt::Connection Type 을 사용 하여 설명 하고,아래 표 는 그 값 과 의 미 를 나타 낸다.
매 거
값.
설명 하 다.
Qt::AutoConnection
0
**(자동 연결,기본 값).**수신 자가 신 호 를 보 내 는 스 레 드 에 머 물 러 있 으 면 Qt:DirectConnection 을 사용 합 니 다.그렇지 않 으 면 Qt:Queued Connection 을 사용 합 니 다.신호 가 발 사 될 때 어떤 관련 유형 을 사용 하 는 지 확인 합 니 다.
Qt::DirectConnection
1
직접 연관.신호 가 발 사 된 후 즉시 슬롯 을 호출 합 니 다.슬롯 이 실 행 된 후에 야 신 호 를 발사 한 후의 코드(즉 emit 키워드 후의 코드)를 실행 할 수 있 습 니 다.이 슬롯 은 신호 스 레 드 에서 실 행 됩 니 다.
Qt::QueuedConnection
2
대기 열 연결.제어 권 이 수신 자 스 레 드 의 이벤트 순환 으로 돌아 간 후에 야 슬롯 이 호출 됩 니 다.즉,emit 키워드 뒤의 코드 는 즉시 실 행 됩 니 다.슬롯 은 잠시 후에 실 행 됩 니 다.이 슬롯 은 수신 자의 스 레 드 에서 실 행 됩 니 다.
Qt::BlockingQueuedConnection
3
대기 열 연결 을 차단 합 니 다.Qt::Queued Connection 과 마찬가지 로 슬롯 이 돌아 올 때 까지 신호 스 레 드 만 계속 막 힙 니 다.수신 자가 신호 스 레 드 에 머 물 러 있 으 면 이 연결 을 사용 할 수 없습니다.그렇지 않 으 면 프로그램 이 잠 겨 있 습 니 다.
Qt::UniqueConnection
0x80
유일한 연관 성.이것 은 위치 나 상기 모든 연결 유형 과 조합 할 수 있 는 표지 입 니 다.Qt::UniqueConnection 을 설정 할 때 는 중복 되 지 않 은 상태 에서 만 연결 이 가능 합 니 다.중복 연결(즉,같은 신호 가 같은 대상 의 똑 같은 슬롯 을 가리 키 는 것)이 있 으 면 연결 이 실패 합 니 다.이 경우 잘못된 QMetaObject::Connection 으로 돌아 갑 니 다.
예시

//  1
A ma; B mb; 
QObject::connect (&ma, SIGNAL( s(int) ), &mb, SLOT(x(int) );

//  2
A ma; B mb; 
mb.connect(&ma, SIGNAL(s(int)), SLOT(x(int));

//  3
A ma; B mb; 
QObject::connect(&ma, &A::s, &mb, &B::x );

//  4
A ma; 
QObject::connect(&ma, &A::s, &B::x);  // void x(int i)   B        

//  5
A ma; B mb;
int indexSig = ma.metaObject()->indexOfSignal("clicked(bool)");
int indexSlot = mb.metaObject()->indexOfSlot("close()");
connect(&ma, ma.metaObject()->method(indexSig), &mb, mb.metaObject()->method(indexSlot));

보충:
4.567917.형식 3 의 슬롯 함 수 는 slots 키 워드 를 사용 하지 않 고 임의의 구성원 함수 가 슬롯 함수 일 수 있 습 니 다.형식 1 의 슬롯 함 수 는 반드시 slots 수식 을 사용 해 야 한다4.567917.형식 1 의 슬롯 함 수 는 private 의 제한 을 받 지 않 습 니 다.즉,슬롯 이 private 이 더 라 도 신 호 를 통 해 이 슬롯 함 수 를 호출 할 수 있 고 형식 3 은 connect 를 사용 할 때 오류 가 발생 합 니 다신호 와 슬롯 의 disconnect

/* 1*/  static bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
/* 2*/  static bool QObject::disconnect(const QMetaObject::Connection &connection)
/* 3*/  static bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject*receiver, PointerToMemberFunction method)
/* 4*/  static bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject*receiver, const QMetaMethod &method)
/* 5*/         bool QObject::disconnect(const char *signal = Q_NULLPTR, const QObject *receiver = Q_NULLPTR, const char *method = Q_NULLPTR) const
/* 6*/         bool QObject::disconnect(const QObject *receiver, const char *method = Q_NULLPTR) const  
보충:
4.567917.형식 3 의 슬롯 함 수 는 slots 키 워드 를 사용 하지 않 고 임의의 구성원 함수 가 슬롯 함수 일 수 있 습 니 다.형식 1 의 슬롯 함 수 는 반드시 slots 수식 을 사용 해 야 한다4.567917.형식 1 의 슬롯 함 수 는 private 의 제한 을 받 지 않 습 니 다.즉,슬롯 이 private 이 더 라 도 신 호 를 통 해 이 슬롯 함 수 를 호출 할 수 있 고 형식 3 은 connect 를 사용 할 때 오류 가 발생 합 니 다Qt4 와 Qt5 의 신호 와 슬롯 의 사용 차이 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.Qt4 와 Qt5 에 관 한 더 많은 신호 와 슬롯 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기