2013-05-14 20 views
6

Próbuję podłączyć niestandardowy sygnał (w klasie klienta TCP) do metody, która aktualizuje dziennik z danymi wysłanymi przez serwer i cokolwiek.PySide/Qt: Zbyt wiele argumentów, aby podłączyć sygnał do gniazda?

Oto deklaracja klasy TCP klienta:

class CarSocket(QObject): 
    logSignal = Signal(str, str) 
    ... 
    def __init__(self, ...): 
     super(CarSocket, self).__init__() 
     ... 

A metoda Próbuję połączyć się logSignal:

def addToLog(self, text, mode='NORMAL'): 
    if mode == 'RAW': 
     toAdd = text 
    else: 
     toAdd = "<p>{}</p> \n <hr> \n".format(text) 
    self.log.logEdit.append(toAdd) 

Więc piszę ten wiersz podczas inicjalizacji mój wniosek:

self.carSocket.logSignal.connect(self.addToLog) 

I dostaję naprawdę dziwny błąd, który pl Wykonuję go:

Traceback (most recent call last): 
    File "/home/ahmed/workspace/autonomee/main.py", line 286, in <module> 
    window = MainWindow() 
    File "/home/ahmed/workspace/autonomee/main.py", line 115, in __init__ 
    self.carSocket.logSignal.connect(self.addToLog) 
TypeError: connect() takes exactly 3 arguments (4 given) 
[Finished in 0.5s with exit code 1] 

Ktoś może pomóc?

Należy zauważyć, że udało mi się już połączyć sygnał niestandardowy z inną klasą (z int, połączony z metodą samej klasy) i że nie mam problemów z podłączeniem sygnałów "domyślnych" do domyślnych gniazd (takich jak self.button.clicked.connect(self.edit.clear) lub coś podobnego)

+0

Przetestowałem twój kod i działało dobrze dla mnie, zarówno z PySide, jak i PyQt4. Czy jesteś zaktualizowany do najnowszej wersji PySide? BTW, użyłem [tego] (http://pastebin.com/JUEEDM5f) jako prostego przykładu do przetestowania, czy to w zasadzie poprawne? – BrtH

+0

Twoje przykłady działają:/(i jak już powiedziałem, pracuję już z innym niestandardowym sygnałem, na innej klasie, która działa idealnie). Mam również najnowszą wersję PySide: 1.1.2 – halflings

+1

Pełny kod źródłowy (bez linii łączącej sygnał) można znaleźć na: https://github.com/halflings/autonomee (połączenie sygnału powinno być wykonane na ' main.py', a klasa 'CarSocket' jest w' carsocket.py' – halflings

Odpowiedz

7

Po prostu miałem ten problem z moim własnym kodem i chciałem przyczynić się do tego, co (myślę) jest odpowiedzią. Masz także funkcję o nazwie "connect" w swojej klasie CarSocket. Spróbuj zmienić nazwę tej funkcji i zobacz, co się stanie.

W moim przypadku jedna z moich klas, która emitowała sygnał, posiadała także funkcję "połącz", a zmiana nazwy rozwiązała problem. Nie powinno to powodować problemu, ponieważ wywołujesz połączenie z samego typu Signal(), ale wydaje się, że występują problemy.

+1

To dziwne, że to pomaga – 101

+1

Ach, w moim przypadku jest tak, ponieważ moja klasa odziedziczyła 'QObject', który również ma metodę connect. – 101

0

Otrzymuję ten sam błąd, gdy próbuję uruchomić twój program. Wygląda naprawdę dziwnie. Znalazłem tylko jedną wzmiankę o tym here, ale nie ma rozwiązania. Jedno mogę zasugerować wam jest starym stylu connect nadal działa poprawnie:

self.connect(self.carSocket, SIGNAL("logSignal(str, str)"), self, SLOT("addToLog(str, str)")) 

Możliwa jest to bug z PySide. W komentarzach ludzie powiedzieli, że nie mają problemu z PySide 1.1.2. Mam też tę wersję i Qt wersji 4.8.4.

+0

Próbowałem i nawet jeśli nie powoduje to błędu programu, to nic nie robi (nic się nie dzieje, gdy wysyłam sygnał) – halflings