2011-10-28 28 views

Trả lời

15

Phương pháp đơn giản là có một khe trung gian gọi khe mà bạn muốn. ví dụ.

connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString))); 

và sau đó

void receiveLink(QString blah) 
{ 
    int response = someFunction(blah); 
    mybutton->call(response); 
} 

Bạn phải xác định một cách nào đó để giải thích các chuỗi thành một int.

+0

ok tôi sẽ cố gắng mà – user896036

33

Từ signals slots documentation:

Chữ ký của một tín hiệu phải khớp với chữ ký của khe nhận. (Trong thực tế, một khe cắm có thể có một chữ ký ngắn hơn so với các tín hiệu nó nhận bởi vì nó có thể bỏ qua đối số thêm.)

này có nghĩa là một tín hiệu có dạng

signal(int, int, QString)

chỉ có thể được kết nối với các khe có các chữ ký sau đây

slot1(int, int, QString) 
slot2(int, int) 
slot3(int) 
slot4() 

Vì koan đề xuất cách tiếp cận tốt nhất là sử dụng một vị trí khác với thuật toán QString nt và sau đó gọi khe bạn thực sự muốn.

+0

nó sẽ có thể để tạo ra một lớp cho môi trường 'đối tượng src', với các chức năng cần thiết trong họ? – chwi

2

Giá trị mặc định cho thông số vị trí giúp rất tốt. Này cho phép kết nối tín hiệu với chữ ký khác nhau để khe (ngược lại để @pnezis câu trả lời):

private slots: 
    void slot(int x = 10, int y = 20, QString text = QString()); 

có thể được kết nối với tín hiệu khác nhau:

signal1(int, int, QString) 
signal2(int, int) 
signal3(int) 
signal4() 

Cũng Qt 4.8 gợi ý hữu ích QSignalMapper lớp :

Lớp này thu thập tập hợp các tín hiệu không tham số và phát lại chúng bằng số nguyên, chuỗi hoặc widg các tham số et tương ứng với đối tượng gửi tín hiệu.

Nhưng chỉ cho một tham số:

QSignalMapper* mapper = new QSignalMapper(this) ; 

connect(action, SIGNAL(triggered()), mapper, SLOT(map())) ; 
mapper->setMapping(action, "param value") ; 

connect(mapper, SIGNAL(mapped(const QString &)), 
    this, SIGNAL(clicked(const QString &))); 
Các vấn đề liên quan