2011-01-24 5 views
6

카레 슬롯이 있습니까? 어쩌면 curryng과 비슷한 것이 있을까요?qt 슬롯 currying

+0

당신의 예를 적어주세요 수 있습니까? –

+0

http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –

답변

1

QSignalMapper를 사용하여 일부 신호를 연결 한 다음 자신의 신호를 매개 변수가 연결된 대상 슬롯에 연결할 수 있습니다. 물론

// connect signal to mapper 
signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(button1, QString("param1")); 
signalMapper->setMapping(button2, QString("param2")); 
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); 

// connect mapper signal to slot 
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &))); 
+0

두 번째'connect' 호출은'button1'이 아니라'button2'라고 말해야한다고 생각합니다. 이 기술을 유용하게 만드는 마법은 신호 매퍼가 고유 한 발신자와 다르게 반응하게하는 마법입니다. – Wyck

2

Qt 신호/슬롯을 사용하여 바인딩 인수를 사용할 수 없습니다. 당신은 boost :: signals과 boost :: bind를 대신 사용하여 이러한 기능을 구현해야합니다.

+0

LibQxt도 옵션입니다. 내 대답을 참조하십시오. –

4

Qt를 직접 사용할 수는 없지만 LibQxt을 통해 일부 바인딩/currying을 사용할 수 있습니다. 예를 들어 및 QxtBoundFunction의 문서에서 : 지금까지

, 가장 일반적인 예상 사용은 신호를 제공하는 일이없는 슬롯에 매개 변수를 제공하는 것입니다. Qt를 처음 사용하는 많은 개발자는 다음과 같은 코드를 작성하려고합니다. \ code connect (button, SIGNAL (클릭)(), lineEdit, SLOT (setText ("Hello, world")))); \ endcode 숙련 된 Qt 개발자는 즉시 결함을 발견합니다. 일반적인 해결책 은 원하는 기능을 호출하는 짧은 한 줄 래퍼 슬롯을 만드는 것입니다. 일부 영리한 개발자는 QSignalMapper를 사용하여 int 또는 QString 매개 변수가 하나만 필요한 슬롯을 처리 할 수도 있습니다.

QxtBoundFunction 이전 연결 문은 다음과 기록 될 수 있습니다 : 은 (버튼, 신호가 (클릭하여 연결 \ 코드를()), QxtMetaObject :: 바인드 (lineEdit, SLOT (의 setText (QString)), Q_ARG (QString , "Hello, world!")))); \ code 새로운 슬롯을 만들지 않고 동일한 결과를 얻거나 더 나쁜 경우에는 상수 값을 전달하기 위해 전체 개체 을 수행해야합니다.

또한 QXT_BIND 매크로를 사용하면 신호의 매개 변수를 QYAR 매크로를 사용하여 에 제공된 상수 인수와 함께 재배치, 건너 뛰기 또는 전달할 수 있습니다. 예를 들어 제네릭 함수에 상태 저장 콜백을 제공하는 데 사용할 수 있습니다.

많은 종류의 기능을 바인딩 할 수 있습니다. 가장 일반적인 바인딩은 Qt 신호와 슬롯에 적용되지만 표준 C/C++ 기능도 바인딩 할 수 있습니다. 향후 개발에서는 C++ 멤버 함수 인 에 바인딩 할 수있는 기능을 추가 할 수 있으며 개발자는 필요에 따라 더 유연한 사용자 지정 QxtBoundFunction 하위 클래스를 만들 수 있습니다.

일부 패치를 LibQxt에 제출했지만 직접 사용하지 않았으므로 마일리지가 다를 수 있습니다.

0

, 지금 우리는 Qt는 5가 임의의 호출 객체에 신호를 연결하는 기능 : 당신이 마음에 무엇을

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg)); 

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });