2012-10-31 3 views
1

위젯 (mainWidget)과 다른 위젯 (childWidget)이 있습니다. 그 위젯입니다.Qt : connect 문을 어디에 둘까요?

내가 원하는 :

connect(childWidget, SIGNAL(somethingHappened(...)), mainWidget, SLOT(handleIt(...)); 

내 질문은 : mainWidget 또는 childWidget 한 장소 연결 문을합니까?

  • 나는 mainWidget의 생성자에서 childWidget을 만들고 다음 줄에 연결 명령문 배치하면 작동합니다. 그러나 childWidget이 생성되면 무언가를 수행 한 다음
    mainWidget이 성공했다고 알립니다. 문이 신호를내는 함수 (childWidget의) 다음에 오는 경우에만 상황이 발생할 수 있습니다. 나는 childWidget의 생성자에서 연결 문을 배치하면

  • ,
    문제는 부모의
    슬롯에 대해 아무것도 모르는 것입니다. childWidget이 mainWidget을 상속 받도록 만들면
    슬롯을 알 수 있지만 이는 나에게 나쁜 해결책이라고 느낍니다. 어쨌든 을 작동시키지 못했습니다. 이것을 할 수있는 적절한 방법이있을 것입니다 - 여전히 저는 입니다.

저는 Qt 프로그래밍을 처음 접했습니다. 사전에 도움을 주셔서 감사합니다.

답변

1

신비한 버그가 발생하지 않도록 코드를 잘 디자인해야합니다. 주 위젯에 연결을 쓰는 것이 더 좋을 것이고 자식 위젯의 생성자에 방사가 있어서는 안됩니다. 아마 당신은 다른 블록으로 방출 코드를 옮기고 건설이 완료된 후에 전화를 할 수 있습니다. 'mainWidget'에서 'childwidget'을 하위 클래스로 분류하면 슬롯에 액세스 할 수없는 유연성이없는 디자인처럼 보입니다. 클래스가 방출하는 신호를 클래스가 알고있는 경우 다른 클래스가 유연하게 연결할 수 있어야합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 함수가 생성자로부터 호출되어 데이터베이스 커넥션을 만들거나 다른 일을하고 mainWidget에 성공했다고 생각할 수 있다고 생각했다. 건설이 완료되기 전에 그것은 아직도있을 것입니다. –

+0

방출 할 때 신호는 발송 전용으로 예약됩니다. 이벤트 루프가 계속 될 때까지 슬롯이 호출되지 않습니다. 그러므로 당신이 생성자에서'QApplication :: processEvents()'를 호출하지 않는다면 (매우 나쁜 생각이다), 생성자로부터 안전하게 신호를 방출 할 수있다. –

+0

멋진데, 신호와 슬롯이 같은 슬롯에 있고 연결 유형이 'DirectConnection'인 경우 직접 함수 호출과 같이 작동한다고 생각했습니다. 또한, 이벤트 루프가 생성자 호출에서 차단되었음을 알지 못했습니다. –

1

항상 자식을 만든 클래스 내부에서 개체를 생성 한 후에 연결 호출을 수행합니다. 그 이유는 간단합니다 : 아이를 생성하는 객체는 아이가 가지고있는 시그널/슬롯을 알고 있으며, 아이는 그 목적을 위해 필요한 시그널/슬롯을 알고 있지만 더 이상 importunity는 알 수 없습니다. 자녀가 부모보다 더 많은 기대를 갖고 있다면 코드의 재사용을 제한 할 것입니다.

생성자의 신호는 다른 사람이들을 수 없다는 것이 맞습니다. 생성자에서 가상 함수를 사용하지 말아야하는 것과 동일한 방법으로 생성자에서 신호를 사용하지 마십시오. 초기화시 신호를 내야하는 경우 분리 된 ini 함수를 작성하고 connect 다음에 호출하십시오.

또한 qobject_cast을 사용하여 런타임시 상위 유형을 판별 할 수 있지만 이는 잘못된 설계 일뿐입니다.

+1

JustMaximumPower, 네가 부모님에 대해 부모님에 대해 더 많이 기대하는 것에 대해 말하는 것은 실제로 나에게 완벽하게 이해된다 : 나는 그런 것들을 피한다면, 내 'childWidgets'은 다른 것보다 더 많은 'parentWidgets'에 의해 활용 될 수있다. –

관련 문제