2012-02-22 4 views
4

차라리 별도 수신기 슬롯 기능을 갖는보다 어레이의 개별 요소를 변경 스핀 컨트롤 블록은, 방금 신호에서 메시지를 전송을 제어하는 ​​지정 원했던Qt는 슬롯

할 수 QSignalMapper로이 작업을 수행하십시오.

spin0 = new QDoubleSpinBox; 
connect(spin0,SIGNAL(valueChanged(double)),this,SLOT(handler(0,double)); 

spin1 = new QDoubleSpinBox; 
connect(spin1,SIGNAL(valueChanged(double)),this,SLOT(handler(1,double)); 
.... 

private slot: 
void handler(int element,double value); 

답변

3

어떤 슬롯 핸들러에서든지 sender()을 사용하여 신호를 보낸 객체에 대한 포인터를 얻을 수 있습니다. 그런 다음 objectName() 속성을 사용하여 더 이상 식별 정보를 전달할 수 있습니다.

+0

그러나 수신기 기능은 GUI의 많은 세부 사항을 알아야합니다. 모든 스핀 컨트롤 개체에 액세스 할 수 있습니다. –

+0

나는 내가 너에게 따라 오는지 잘 모르겠다. 핸들러에서 각 스핀 컨트롤의 객체 이름을 "0", "1"등으로 설정하면'sender() -> objectName(). toInt()'를 사용하여 위에서 언급 한 내용을 달성 할 수 있습니다 . 핸들러는 QObject가 신호를 보낸 것 이상을 알 필요가 없습니다. claify하기 위해서'sender()'는 handler()가 상주하는 객체의 함수이다. 모든 스핀 컨트롤에 대해 알 필요가 없습니다. –

+0

개체 이름을 사용하는 것이 좋습니다. 그렇습니다. 좋은 해결책입니다. 나는 발신자()를 처리기에 gui를 너무 가깝게 연결 한 spin0 ptr과 비교할 생각을했습니다. –

1

나는 적어도 그 구문을 사용하여, 그렇게 생각하지 않습니다 ... SIGNALSLOT 매크로는 구문 분석 및 룩업하기 위해 관련 기능을 Qt는 런타임에 의해 사용되는 문자열로 자신의 주장을 켜 및/또는 컴파일의 사전 처리 단계에서 moc에 의해 생성 된 테이블의 클래스 메서드 따라서 SLOT 매크로에 기본 인수를 인코딩 한 경우 Qt가 moc 생성 함수 테이블에서 실제 슬롯 함수의 런타임 조회를 위해 사용할 수있는 유효한 함수 서명이 아닙니다.