2011-01-24 30 views
6

Có khe curt qt không? Có lẽ có cái gì đó tương tự như curryng?khe qt currying

+0

Bạn có thể xin vui lòng cho một ví dụ về những gì bạn có trong tâm trí? –

+0

Có vẻ như một bản sao của http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –

Trả lời

1

Bạn có thể sử dụng QSignalMapper để liên kết kết nối một số tín hiệu với nó và sau đó kết nối các tín hiệu riêng của nó để nhắm mục tiêu các vị trí kèm theo một số tham số.

// connect signal to mapper 
signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(button1, QString("param1")); 
signalMapper->setMapping(button2, QString("param2")); 
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); 

// connect mapper signal to slot 
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &))); 
+0

Tôi nghĩ rằng lệnh 'connect' thứ hai sẽ nói 'button2', không phải' button1'. Tôi đoán đó là phép thuật có thể làm cho kỹ thuật này hữu ích: để người lập bản đồ tín hiệu phản ứng khác với những người gửi duy nhất. – Wyck

2

Đối số ràng buộc không thể sử dụng tín hiệu/khe Qt. Bạn sẽ phải sử dụng boost :: signal và boost :: bind thay vì để đạt được chức năng như vậy.

+0

LibQxt cũng là một tùy chọn, hãy xem câu trả lời của tôi. –

4

Mặc dù không thể trực tiếp sử dụng Qt, một số ràng buộc/currying có sẵn thông qua LibQxt. Ví dụ và từ các tài liệu của QxtBoundFunction:

Cho đến nay, việc sử dụng dự kiến ​​phổ biến nhất là để cung cấp một tham số để một khe khi tín hiệu không có lời đề nghị một. Nhiều nhà phát triển mới cho Qt cố gắng viết mã như thế này: \ code kết nối (nút, SIGNAL (đã nhấp()), lineEdit, SLOT (setText ("Xin chào, thế giới"))); \ endcode Nhà phát triển Qt có kinh nghiệm sẽ ngay lập tức phát hiện lỗ hổng ở đây. Giải pháp điển hình là tạo một khe bao bọc một dòng ngắn, gọi hàm mong muốn. Một số nhà phát triển thông minh thậm chí có thể sử dụng QSignalMapper để xử lý các vị trí chỉ cần một thông số int hoặc QString .

QxtBoundFunction phép câu lệnh kết nối trước đó được viết như thế này: \ đang Connect (nút, SIGNAL (nhấp()), QxtMetaObject :: bind (lineEdit, SLOT (setText (QString)), Q_ARG (QString , "Chào thế giới!"))); \ code Điều này hoàn thành cùng một kết quả mà không phải tạo một vị trí mới hoặc tệ hơn, toàn bộ đối tượng, chỉ để chuyển một giá trị không đổi.

Ngoài ra, thông qua việc sử dụng macro QXT_BIND, các tham số từ tín hiệu có thể được sắp xếp lại, bỏ qua hoặc truyền cùng với đối số liên tục được cung cấp với macro Q_ARG. Điều này có thể được sử dụng để cung cấp callbacks stateful cho một hàm số generic.

Nhiều loại chức năng có thể bị ràng buộc. Các ràng buộc phổ biến nhất áp dụng cho tín hiệu Qt và khe, nhưng chức năng C/C++ chuẩn cũng có thể bị ràng buộc. Phát triển trong tương lai có thể thêm khả năng liên kết với các hàm thành viên C++, và nhà phát triển có thể tạo các lớp con QxtBoundFunction tùy chỉnh để có thêm tính linh hoạt nếu cần.

Mặc dù tôi đã gửi một số bản vá lỗi cho LibQxt, tôi chưa sử dụng trực tiếp này để số dặm của bạn có thể thay đổi.

0

Tất nhiên, bây giờ chúng tôi có Qt 5 và khả năng kết nối tín hiệu vào các đối tượng có thể được gọi tùy ý:

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg)); 

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); }); 
Các vấn đề liên quan