Biblioteka Qt - łączenie sygnałów ze slotami

Biblioteka Qt - łączenie sygnałów ze slotami
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 3 godziny
  • Postów:148
0

Witam. Mam pewien problem przy łączeniu sygnału clicked() ze swoim własnym slotem. Slot ma zwracać wartość typu string, żebym mógł ją przypisać do jakiegoś obiektu podczas kliknięcia. Z tego co wiem, to niemożliwe, bo zwracana przez slot wartość jest tracona podczas wykonywania sygnału. Dlatego chciałbym przekazać referencję jakiegoś obiektu do slotu przez argument, a funkcja sama zajęłaby się przypisywaniem. Niestety to także niemożliwe, bo (z tego co przeczytałem) slot musi mieć tyle samo argumentów co sygnał. Sygnał clicked() nie ma argumentów, więc przecież nie da rady. Pozostaje jeszcze przypisanie do zmiennej globalnej, ale staram się tego unikać. Czy tylko to mi pozostaje?

Poza tym jeszcze małe pytanie: co oznacza trzeci argument funkcji connect(...)?

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Dla Qt4 masz QSignalMapper
Dla Qt5 masz od wyboru QSignalMapper albo wykonać połączanie za pomocą wyrażenia lambda (znacznie prostsze w napisaniu).

Trzeci argument connect? Jeśli chodzi ci o ostatni argument, to określa on jak ma być wykonane wywołanie slotu przez sygnał: synchronicznie, asynchronicznie (przez event loop) czy mieszanie zależnie z jakiego wątku emitowany jest sygnał.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
GO
Mógłbyś mi napisać takie przykładowe wyrażenie?
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

http://qt-project.org/wiki/New_Signal_Slot_Syntax

Kopiuj
connect(button, &QPushButton::clicked, [=]() {
                          obiektDocelowy->setText(tr("Tadaaa!")));
                     });

Pamiętaj, że w przypadku takiego połącznia nie ma automatycznego rozłączania, jeśli jeden z obiektów zostanie usunięty!


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
GO
Dzięki. Po co jednak trzeci argument ([=]...)?
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 3 godziny
  • Postów:148
0

Użyłem tego i są błędy ;/

  1. [ścieżka do pliku]: błąd: no matching function for call to 'MainWindow::connect(QPushButton*&, void (QAbstractButton::*)(bool), MainWindow::MainWindow()::__lambda0)'
    });
    ^

  2. [ścieżka do pliku]: błąd: template argument for 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)' uses local type 'MainWindow::MainWindow()::__lambda0'
    });
    ^

  3. [ścieżka do pliku]: błąd: template argument for 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)' uses local type 'MainWindow::MainWindow()::__lambda0'
    });
    ^

A pod nimi długie wyjaśnienia....

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
1

Popraw tak:

Kopiuj
connect(button, &QPushButton::clicked, [=](bool checked) {
                          obiektDocelowy->setText(tr("Tadaaa!")));
                     });

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
GO
Nadal są błędy. Poza tym chciałbym wiedzieć co oznacza trzeci argument. A może do korzystania z tych wyrażeń potrzeba dołączyć jakiś nagłówek, którego ja nie dodałem?
MarekR22
tym razem sprawdziłem i u mnie się kompiluje i działa jak należy. No chyba, że nie doczytałeś i nie używasz Qt5 lub nie masz włączonego C++11 (ale wygląda na to , że masz dobrze). Jak nie działa to znowu wklej co ci kompilator zgłasza i może też kod, który ma problemy (wraz z kontekstem).
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 3 godziny
  • Postów:148
0

Wszystko działa. Kiedy włączyłem nową wersję C++11, wszystko zaczęło śmigać ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.