2012-12-23 22 views
8

TheoXác định tín hiệu pyqt4 với một danh sách như là đối số

http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html

tôi có thể xác định một pyqt4-tín hiệu với có một đối số nguyên bởi mysignal = pyqtSignal(int). Làm thế nào tôi có thể xác định một tín hiệu mà có một số nguyên và một danh sách các chuỗi hoặc nhiều hơn nói chung của một đối tượng gọi là myobject làm đối số.

Trả lời

14

Đoạn mã sau tạo tín hiệu lấy hai đối số: một số nguyên và danh sách đối tượng. Giao diện người dùng chỉ chứa một nút. Tín hiệu được phát ra khi nút được nhấp.

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Foo(object): 
    pass 

class MyWidget(QWidget): 
    mysignal = pyqtSignal(int, list) 

    def __init__(self, parent=None): 
     super(MyWidget, self).__init__(parent) 
     self.hlayout = QHBoxLayout() 
     self.setLayout(self.hlayout) 
     self.b = QPushButton("Emit your signal!", self) 
     self.hlayout.addWidget(self.b) 
     self.b.clicked.connect(self.clickHandler) 
     self.mysignal.connect(self.mySignalHandler) 

    def clickHandler(self): 
     self.mysignal.emit(5, ["a", Foo(), 6]) 

    def mySignalHandler(self, n, l): 
     print n 
     print l 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    w = MyWidget() 
    w.show() 
    sys.exit(app.exec_()) 

Khi nhấp vào nút bạn sẽ thấy một cái gì đó như:

5 
['a', <__main__.Foo object at 0xb7423e0c>, 6] 

trên thiết bị đầu cuối của bạn.

+0

Ồ, ví dụ tuyệt vời của tôi! :) – kuanyui

+0

Bravo. Điều này hy vọng cho phép cái chết của 'lambda' trong kết nối()? –

+0

Bạn chưa sử dụng trang trí 'pyqtSlot'. Tôi đã có lỗi seg biến mất sau khi chèn nó, vì vậy tôi sẽ khuyên bạn nên thêm nó vào 'mySignalHandler'. –