2013-05-14 43 views
6

Tôi đang cố gắng kết nối một tín hiệu tùy chỉnh (trong một lớp khách hàng TCP) với một phương thức cập nhật nhật ký với dữ liệu được gửi bởi máy chủ và không có gì.PySide/Qt: Có quá nhiều đối số để kết nối tín hiệu với khe?

Đây là tuyên bố của lớp TCP khách hàng:

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

Và phương pháp Tôi đang cố gắng để kết nối với 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) 

Vì vậy, tôi viết dòng này khi khởi tạo ứng dụng của tôi:

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

Và tôi nhận được một lỗi thực sự lạ vi Tôi thực hiện nó:

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] 

Bất cứ ai cũng có thể giúp đỡ? Cần phải lưu ý rằng tôi đã kết nối thành công tín hiệu tùy chỉnh trên một lớp khác (với int, được kết nối với một phương thức của lớp) và tôi không gặp vấn đề gì khi kết nối các tín hiệu 'mặc định' với các khe mặc định (như self.button.clicked.connect(self.edit.clear)). hoặc một cái gì đó tương tự)

+0

Tôi đã thử nghiệm mã của bạn và nó hoạt động tốt cho tôi, cả với PySide và PyQt4. Bạn có cập nhật lên phiên bản mới nhất của PySide không? BTW, tôi đã sử dụng [this] (http://pastebin.com/JUEEDM5f) làm ví dụ thô để kiểm tra nó, về cơ bản có chính xác không? – BrtH

+0

Ví dụ của bạn hoạt động:/(và như tôi đã nói tôi đã làm việc với một tín hiệu tùy chỉnh khác, trên một lớp khác, hoạt động hoàn hảo). Tôi cũng có phiên bản mới nhất của PySide: 1.1.2 – halflings

+1

Mã nguồn đầy đủ (trừ dòng kết nối tín hiệu) có thể được tìm thấy trên: https://github.com/halflings/autonomee (kết nối tín hiệu sẽ được thực hiện trên ' main.py'; và lớp 'CarSocket' nằm trong' carsocket.py' – halflings

Trả lời

7

Chỉ gặp vấn đề này với mã của riêng tôi và muốn đóng góp những gì tôi (nghĩ) là câu trả lời. Bạn cũng có một chức năng gọi là "kết nối" trong lớp CarSocket của bạn. Hãy thử đổi tên chức năng đó và xem điều gì xảy ra.

Trong trường hợp của tôi, một trong các lớp học của tôi phát ra tín hiệu cũng có chức năng "kết nối" và đổi tên nó đã khắc phục được sự cố. Nó không nên gây ra một vấn đề kể từ khi bạn gọi kết nối từ các tín hiệu() loại chính nó, nhưng có vẻ là vấn đề.

+1

Thật lạ khi điều đó giúp ích – 101

+1

Ah, trong trường hợp của tôi, đó là vì lớp của tôi được thừa hưởng 'QObject', cũng có một phương thức kết nối. – 101

0

Tôi gặp lỗi tương tự khi tôi cố gắng chạy chương trình của bạn. Trông thật kỳ lạ. Tôi đã tìm thấy chỉ có một đề cập về rằng here nhưng không có giải pháp. Một điều tôi có thể đề xuất bạn là kiểu cũ connect vẫn hoạt động chính xác:

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

Có thể đó là lỗi của PySide. Trong các ý kiến ​​mọi người nói rằng họ không có vấn đề với PySide 1.1.2. Tôi cũng có phiên bản này và Qt phiên bản 4.8.4.

+0

Tôi đã thử nó và thậm chí nếu nó không gây lỗi chương trình, nó không làm gì cả (không có gì xảy ra khi tôi phát ra tín hiệu) – halflings