2014-01-27 4 views
2

PySide 및 PyQt는 trasmistted 데이터 유형이 일치하는 한 임의의/다중 신호를 여러 슬롯에 연결할 수있는 Qt 신호 슬롯 메커니즘을 사용합니다.신호에서 슬롯 연결 해제

시그널링 객체는 수신 슬롯에 대한 어떤 지식을 가지고있다. 자신의 번호를 방법 receivers으로 알고 있거나 신호가 disconnect 방법을 통해 수신 슬롯에서 끊어 질 수 있습니다.

내 문제는 타당한 방향과 관련이 있습니다. 슬롯은 신호가 연결된 신호를 알고 있습니까? 신호와 슬롯을 분리 할 수 ​​있습니까?

업데이트 : 왜 내가 이것을 묻고 있습니까? 저는 계산을 수행하는 객체를 가지고 있습니다. 계산은 사용자가 편집 할 수있는 Python 표현식에 의해 정의됩니다. 표현식이 파싱되고 필요한 데이터 소스가 다음과 같이 식별됩니다 ... 계산 객체 (슬롯 역할)가 이러한 데이터 소스에 연결 (신호로 작동)하고 데이터 소스가 값을 생성/업데이트하면이 사실은 다음과 같습니다. 슬롯에 신호를 보내고 표현식을 다시 평가합니다. 사용자가 표현식을 변경하면 다시 구문 분석하여 기존 신호 (즉, 데이터 소스)와의 연결을 끊고 새 데이터 소스에 연결해야합니다. 다른 셀에 연결된 Excel의 수식과 같은 것으로 상상할 수 있습니다.

이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 수동으로 연결을 추적하는 것 (추가 작업) 또는 표현 개체를 삭제하고 변경 될 때마다 새 개체를 만드는 것입니다 (사용자가 계산 데이터 원본을 추적 할 수있어 도움이되지 않을 수 있으므로 충분히 좋지 않은 것 같습니다) . 그러나 단순한 신호 슬롯 메커니즘을 사용하여이 문제를 해결할 수 있는지 궁금했습니다. 다른 말로하면, 나는 어떤 해결 방법에도 관심이 없다 ... 나는 그들에 대해 알고 있고 신호를 사용한다. 슬롯은 여기서 도움이되지 않는다. :)

+0

나는 그렇게 생각하지 않는다. 그러나 수동으로 연결과 연결 해제를 추적 할 수 있습니다 (예 :'QObject :: connect' 래퍼 사용). –

+0

수신 개체가 삭제 될 때 수신자 중 하나가 신호를 보내는 것을 멈추도록 신호를 알려야하기 때문에 무언가가 있어야한다고 생각합니다. 그러나 나는 문서에서 아무 것도 발견하지 못했습니다 ... 물론, 수동으로 트랙을 유지하는 것이 나의 다른 대안입니다. 그러나 Qt가 자동으로이 작업을 수행 할 수 있다면 이중 작업을하지 않는 것이 좋습니다. –

+0

잘못된 질문을하는 것 같아요. 어떤 문제를 해결하려고하는지 설명해주십시오. 해결책에 대한 아이디어를 신비한 문제로 수정하는 방법을 묻지 마십시오. 도움을 요청할 때 이것은 아주 흔한 실수입니다. 슬롯이 연결된 곳을 알아야하는 이유는 무엇입니까? 어쩌면이 경우 재귀를 방지하기 위해 일시적인 연결 해제 신호가 필요합니까?가능한 재귀를 막기 위해'blockSignals' 메소드가 있습니다. –

답변

2

제안한 접근 방식은 구체적인 데이터 위젯과 계산 엔진간에 매우 밀접한 관계가 있습니다. 당신은 UI와 계산을 섞는다. 이것은 그것이 필요로하는 것보다 훨씬 더 어렵게 만듭니다.

대신 모델보기 접근 방식을 시도해 볼 수 있습니다. 이 모델은 QAbstractTableModel의 간단한 구현입니다. 보기는 QDataWidgetMapper을 사용하여 모델 셀에 매핑 된 개별 데이터 입력 위젯입니다. 계산 엔진은 위젯이 모델을 수정하는 방법을 전혀 모른 채 모델에만 액세스합니다. 이것은 인생을 더 쉽게 만듭니다.

계산 개체는 하나의 dataChanged 신호를 사용하여 모델에 연결할 수 있으며 변수에 대한 변경 사항이 통보됩니다. 테이블에 두 개의 열을 가짐으로써 값과 변수 이름을 쉽게 전달할 수 있습니다.

모델의 구현은 매우 간단 할 수 있습니다. 첫 번째 열의 변수 이름에 대한 문자열 목록과 두 번째 열의 변형 목록을 가질 수 있습니다. 물론 모델은 setData이 호출 될 때마다 dataChanged 신호를 올바르게 방출해야합니다.

+0

나는 이것이 총 과잉이라고 생각한다. :) 내가 언급 한 훨씬 간단한 해결 방법이있다. Btw. UI, 위젯 등등에 대해서는 아무 말도하지 않았습니다. 신호/슬롯은 QWidget뿐만 아니라 QObject에 바인딩 된 메커니즘입니다. 내 위젯은 다른 레이어에 있는데, 나는 내 질문에서 만지지도 않았다. –

+0

@ VL.K. 데이터 소스를 계산 엔진에 깔끔하게 매핑하는 방법을 물어 봤습니다. 어떻게했는지 보여 줬어. 그것은 훌륭하게 작동합니다.이 접근법을 널리 사용하며 다루기가 매우 쉽습니다. 다른 솔루션보다 코드가 적고 유지 보수가 훨씬 쉬울 수 있습니다. 소프트웨어 요소 간의 느슨한 커플 링은 좋은 엔지니어링 실습 인 것으로 간주됩니다. –

+0

@ VL.K. 위젯은 선택 사항이며 데이터를 수정하는 데는 문제가되지 않습니다. 거래는 계산 엔진이 다양한 변수 종속 연결을 처리 할 필요가 없다는 것입니다. 그건 나쁜 디자인이야. 데이터 모델을 사용하면'dataChanged'에 대한 신호 슬롯 연결은 단 하나 뿐이므로 엔진에 모델 포인터 만 있으면됩니다. 계산 엔진이 훨씬 쉽습니다. 또한 모델의 내용을 쉽게 해결할 수 있습니다. 단지 'QTableView'에 첨부하면됩니다. –