2012-03-25 13 views
12

Aby podłączyć sygnały do ​​gniazd, o ile wiem, parametry sygnału muszą odpowiadać parametrom gniazda. Tak więc na przykład:Podłącz sygnały do ​​gniazd o stałych wartościach

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

ale co jeśli chcę mieć połączenie sygnału slot że ma inną ilość parametrów, ale zawsze przechodzą stałą wartość do gniazda. Na przykład, przy użyciu wyżej kawałek kodu:

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

Lub innymi słowy, gdy przycisk jest wciśnięty, to wywołuje funkcję setDockWidget() z fałszywym parametru. czy to możliwe?

Odpowiedz

8

Nie, nie jest to możliwe. Możesz jedynie łączyć gniazda z mniejszą lub równą liczbą argumentów niż z odpowiednim sygnałem. (zobacz documentation)

Musisz utworzyć gniazdo proxy, które będzie wywoływać pożądany.

+1

Ta odpowiedź nie jest już prawidłowa, ponieważ składnia Qt5 w C++ 11 sprawia, że ​​dość łatwo jest użyć lambda do tego celu. –

+1

@ André, Po drugiej stronie, po prostu możesz "stworzyć proxy slot, który wywoła pożądany." Teraz na miejscu – Lol4t0

+1

Oczywiście, możesz. Ale dodatkowy slot oznacza więcej rzeczy w nagłówku, których nie chcesz, odsłaniając połączenia zewnętrzne (tak, nawet jeśli prywatny automat może zostać wywołany z zewnątrz) i rozprzestrzenia się wokół kodu w wielu lokalizacjach. Możesz nawet potrzebować dodatkowych zmiennych składowych, aby zawierać wartości, które chcesz przekazać, wprowadzając w ten sposób dodatkowy stan w klasie. Rozwiązanie lambda jest o tyle bardziej eleganckie, że dyskwalifikuje wprowadzenie proxy jako rozwiązania IMO. –

6

W pewnym sensie tak, można. Ale to nie jest bardzo mocny: po prostu zadeklarować setDockWidget ten sposób:

[virtual] void setDockWidget(bool state=false) ; 

i deklarują To połączenie sposób:

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidget wywołana bez argumentów wziąć te domyślne.

8

Można użyć lambda z żądanego połączenia z stałym argumentem. Przykład:

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

Więcej informacji na temat nowych wtykowym składnię: https://wiki.qt.io/New_Signal_Slot_Syntax.

+0

Czy w twoim przypadku można mieszać stały argument ze zmienną? –

+0

@AlekseyKontsevich: Jeśli dobrze cię rozumiem, chcesz przekazać zmienną z sygnału do gniazda również? Oczywiście że możesz. Zrób z niego argument dla lambda i użyj tego argumentu w wywołaniu funkcji. Zalecam jednak użycie argumentu kontekstowego z wartością "this". W ten sposób możesz być pewien, że połączenie zostanie zniszczone, jeśli obiekt odbiorczy zostanie zniszczony. W przeciwnym razie możesz skończyć się niezdefiniowanym zachowaniem. –

Powiązane problemy