Signal and Slot

0

Hej,

Mam 2 klasy A i B. W klasie A wysyłam sygnał: emit signal. Chciałbym w klasie B ten sygnał "odebrać" i go obsłużyć. Jak to zrobić? Próbowałem w ten sposób, że w konstruktorze klasy B tworzyłem wskaźnik na obiekt klasy A. Następnie napisałem w tym konstruktorze connect(A,SIGNAL(signal), this, SLOT(fun)). Ale to nie działa. Proszę o jakieś wskazówki.

1

Łączysz konkretne obiekty, nie klasy. Jeśli w konstruktorze B tworzysz nowy obiekt A to nie ma to żadnego wpływu na podłączenie innych A do tej instancji B. Dodatkowo pewnie masz wyciek pamięci.

0

Pomyłka. Stworzyłem obiekt klasy A: A *obiekt = new A(); Nstępenie

 connect (obiekt,SIGNAL(signal),this, SLOT(fun));
1

Pomijając już korzystanie z nagich wskaźników, próbowałeś na obiekt wywołać signal?

0

Tu pewnie wykaże się brakiem wiedzy.... ale co masz na myśli pisząc wywołać sygnał na obiekt? I jeszcze jedno, jak poprawnie powinno wyglądać połączenie? Stworzyć zwykły obiekt A bez referencji?

connect(&A,SIGNAL(signal),this,SLOT(fun))

?

1

Łączysz konkretne obiekty, nie klasy.

0

Eh, znowu się pomyliłem.... Miałem na myśli:

&obiekt
0

Pytanie Qt czy boost?
Jeśli Qt to musisz mieć odpowienia makro wklepane, żeby w danej klasie w ogóle użyć "connect" i oczywiście dziedziczyc po QObject.

Edit: Jesli sypnął błędem, to go wklej.

0

Zrobiłem poprawki ale dalej mam błąd. To może od początku :)

W main mam zmienna globalna

Game* game

W pliku źródłowym Game mam między innymi

player = new Player()
health = new Health()

W klasie Player mam metodę

game_over()

która usuwa postać z scene

 a także usuwa ze stery. 
W klasie Health mam metodę 
```c
decrease()

która obniża poziom zdrowia do zera. Gdy jest zero metoda emituje sygnał GameOver

Na samym początku mam 
```c
extern Game *game

W konstrukotrze klasy Health mam:

connect(this, SIGNAL(GameOver()),game->player,SLOT(game_over()))

Jest "wywałka" aplkacji właśnie na tym connect :/ Nie ma żadnych informacji o błędach.

0

No to już wiem ;)

W skrócie wygląda to tak: GAME zawiera player i health. Zatem Game wie o obiekcie playera i obiekcie health.
W Twoim connect (konstruktor klasy Health) przekazujesz game->player o którym klasa health chyba nie ma pojęcia.

Rozwiązanie: Zrób connect w klasie Game:

connect(game->health, SIGNAL(GameOver()),game->player,SLOT(game_over))

Jeśli to tylko to to powinno działać.

EDIT: masz extern co prawda, ale spróbuj tego co napisałem.

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