QT 신호 와 슬롯 connect

9595 단어 connect
QT 신호 와 슬롯 connect
  • QT 신호 와 슬롯 connect
  • connect 함수 호출 몇 가지 제한
  • connect 함수 코드


  • QT 에서 신호 와 슬롯 의 연결 에 사용 되 는 connect 함 수 는 정적 함수 로 클래스 QObject 에서 정 의 됩 니 다.여기 서 말 하 는 것 은 QT5 환경 에서.더 자세 한 소 개 는 여 기 를 볼 수 있 습 니 다 http://www.devbean.net/2012/12/how-qt-signals-and-slots-work-qt5/
    connect 함수 호출 몇 가지 제한
  • 1. 신호 의 발송 자 는 반드시 QObject 의 파생 대상 이 어야 한다.그렇지 않 으 면 error: invalid conversion from 'XXX*' to 'const QObject*' [-fpermissive]... 의 오류 가 발생 할 것 이다.
  • 2. 홈 함수 의 대상 은 반드시 QObject 의 파생 대상 이 어야 한다.그렇지 않 으 면 error: no matching function for call to 'QObject::connect(XXX*, 의 오류 가 발생 할 것 이다.여기 서 주의해 야 할 것 은 신호 함수 가 존재 하 든 안 하 든 잘못 보고 하지 않 을 것 이다.그러나 신호 발송 자가 NULL 이면 운행 중 QObject::connect: Cannot connect (null):: () to :: () 문 제 를 제시한다.
  • 1,2 두 가지 점 에 대해 connect 함수 가 호출 될 때 강 한 전환 유형 도 컴 파일 을 통 해 컴 파일 할 수 있 지만 실행 할 때 No such slot QObject:: 문 제 를 알려 줍 니 다.
  • 3. 슬롯 함수 가 있 는 클래스 의 정의 에 매크로 Q_OBJECT 를 추가 해 야 합 니 다. 그렇지 않 으 면 QObject::connect: No such slot ... 의 오류 가 발생 할 수 있 습 니 다.여 기 는 2 점 과 연결 되 어야 합 니 다. Q_OBJECT 매크로 를 추가 한 클래스 가 QObject 에서 파생 되 지 않 으 면 moc 중간 파일 을 생 성 할 때 오류 가 발생 합 니 다 Error: Class contains Q_OBJECT macro but does not inherit from QObject.Q_OBJECT 매크로 를 추가 한 후 컴 파일 에 undefined reference to ‘vtable for... 오류 가 발생 하면 build 디 렉 터 리 에 있 는 Makefile 파일 을 삭제 하고 다시 생 성 하 십시오.
  • 4. 신호 함수 의 signals 수식 과 슬롯 함수 의 slots 수식 은 사실 필수 적 이다.생 성 된 중간 코드 에 서 는 제거 되 지만

  • 문제.
    원인.error: no matching function for call to 'QObject::connect(XXX*,
    신호 의 발송 자 와 수용 자 는 반드시 QObject 의 파생 대상 이 어야 한다.QObject::connect: No such slot ...
    면 의 조건 을 만족 시 킨 후에 홈 함수 가 있 는 클래스 의 정의 에 추가 (사용) 해 야 합 니 다 Q_OBJECT 매크로Error: Class contains Q_OBJECT macro but does not inherit from QObject Q_OBJECT 매크로 를 추가 한 클래스 는 QObject 에서 파생 된 것 이 아 닙 니 다.undefined reference to ‘vtable for...
    이것 은 Q_OBJECT 매크로 를 추가 한 후에 컴 파일 된 것 으로 업데이트 Makefile 파일 이 없 기 때 문 입 니 다.build 디 렉 터 리 에 있 는 Makefile 파일 을 삭제 하고 qmake 다시 생 성 하 십시오.
    connect 함수 코드
    connect 는 템 플 릿 함수 이지 만 매개 변수의 유형 에 대한 요구 가 있 습 니 다.이 함수 의 반환 값 은 QMetaObject::Connection 형식 입 니 다.
     1 //Connect a signal to a pointer to qobject member function
    
     2 //        qobject        
    
     3 
    
     4 template <typename Func1, typename Func2>
    
     5 static inline QMetaObject::Connection connect(
    
     6     const typename QtPrivate::FunctionPointer<Func1>::Object *sender,
    
     7     Func1 signal,
    
     8     const typename QtPrivate::FunctionPointer<Func2>::Object *receiver,
    
     9     Func2 slot,Qt::ConnectionType type = Qt::AutoConnection
    
    10     )
    
    11 {
    
    12     typedef QtPrivate::FunctionPointer<Func1> SignalType;
    
    13     typedef QtPrivate::FunctionPointer<Func2> SlotType;
    
    14 
    
    15     //        Q_OBJECT 
    
    16     Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
    
    17                       "No Q_OBJECT in the class with the signal");
    
    18 
    
    19     //compilation error if the arguments does not match.
    
    20     //21     //
    
    22     Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
    
    23                       "The slot requires more arguments than the signal provides.");
    
    24     //
    
    25     Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
    
    26                       "Signal and slot arguments are not compatible.");
    
    27     //
    
    28     Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
    
    29                       "Return type of the slot is not compatible with the return type of the signal.");
    
    30 
    
    31     const int *types = 0;
    
    32     if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
    
    33         types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
    
    34 
    
    35     //QObject::connectImpl              。
    
    36     //       ,          。
    
    37     return connectImpl(sender, reinterpret_cast<void **>(&signal),
    
    38                        receiver, reinterpret_cast<void **>(&slot),
    
    39                        new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
    
    40                        typename SignalType::ReturnType>(slot),
    
    41                        type, types, &SignalType::Object::staticMetaObject);
    
    42 }

    좋은 웹페이지 즐겨찾기