Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Qt]Signals and slots.

Ostatnio zmodyfikowano 2015-02-03 20:25
Autor Wiadomość
Harrel
Temat założony przez niniejszego użytkownika
[Qt]Signals and slots.
» 2015-02-03 00:57:11
Witam.

Mam problem z połączeniem sygnałów i slotów.
Załóżmy, że mam tablice wskaźników na obiekty QLineEdit i chcę połączyć sygnał jaki one imitują (textChanged(QString)) ze slotem.
Mniej więcej użycie 'connecta' wygląda tak:
C/C++
for( int i = 0; i < 16; i++ )
{
    QObject::connect( lineEdits[ i ], SIGNAL( textChanged( QString ) ), this, SLOT( textChangedSlot( QString ) ) );
}
Ale tu pojawia się właśnie problem bo nie będę w stanie rozróżnić który obiekt wyemitował sygnał (czy to lineEdits[0] czy też lineEdits[15]).
Pierwszą moją głupią myślą było dodanie dodatkowego argumentu do slota:
C/C++
QObject::connect( lineEdits[ i ], SIGNAL( textChanged( QString ) ), this, SLOT( textChangedSlot( QString, i ) ) );
Ale oczywiście nie ma prawa to działać i mimo to że nawet program sie kompiluje w takiej postaci to najzwyczajniej w świecie funkcja connect nie hula.

No i tu moje pytanie - jak to zrobić aby hulało?
Problem wydaję się pospolity, więc myślę, że rozwiązanie jest całkiem trywialne.
P-125915
Monika90
» 2015-02-03 13:07:02
Na podstawie tego http://doc.qt.io/qt-5​/qobject.html#connect-5
C/C++
QObject::connect( lineEdits[ i ], & QLineEdit::textChanged,[ this, i ]( QString s )
{
    textChangedSlot( s, i );
} );

Czy to jest dobrze? Nie wiem, nie sprawdzałam.
P-125945
Harrel
Temat założony przez niniejszego użytkownika
» 2015-02-03 13:58:11
Działa idealnie. Mimo tego, że średnio rozumiem składnie tej funkcji, to rozwiązuje ona problem.
Dzięki wielkie!
P-125952
turaz
» 2015-02-03 20:25:06
Hej.
1. Możesz użyć lambdy tak jak to pokazała Monika90
2. Możesz w slocie wykonać qobject_cast na sender'ze, czyli tak:
C/C++
void textChangedSlot( const QString & text )
{
    QLineEdit * lineedit = qobject_cast < QLineEdit *>( sender() );
}
i posługiwać się tym wskaźnikiem
P-125963
« 1 »
  Strona 1 z 1