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

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(...)?

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ł.

0

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

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!

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....

1

Popraw tak:

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1