QT 신호 와 슬롯 connect
9595 단어 connect
QT 에서 신호 와 슬롯 의 연결 에 사용 되 는
connect
함 수 는 정적 함수 로 클래스 QObject
에서 정 의 됩 니 다.여기 서 말 하 는 것 은 QT5
환경 에서.더 자세 한 소 개 는 여 기 를 볼 수 있 습 니 다 http://www.devbean.net/2012/12/how-qt-signals-and-slots-work-qt5/connect 함수 호출 몇 가지 제한
QObject
의 파생 대상 이 어야 한다.그렇지 않 으 면 error: invalid conversion from 'XXX*' to 'const QObject*' [-fpermissive]...
의 오류 가 발생 할 것 이다.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::
문 제 를 알려 줍 니 다.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
파일 을 삭제 하고 다시 생 성 하 십시오.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 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Dr.Sum Connect를 이용한 월초, 월말 취득 방법 [ETL은 거의 동일][자세한 내용은 여기 있습니다] Dr.Sum은 1초에 10억 개의 데이터를 계산할 수 있는 초고속 데이터베이스 도구입니다. 또 Dr.Sum은 합계 속도뿐 아니라 데이터베이스 구축 경험이 적은 사람도 GUI 조작으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.