Kết nối tín hiệu QML để C thường xuyên ++ khe rất dễ dàng:Connect QML tín hiệu C++ 11 khe lambda (Qt 5)
// QML
Rectangle { signal foo(); }
// C++ old-style
QObject::connect(some_qml_container, SIGNAL(foo()), some_qobject, SLOT(fooSlot()); // works!
Tuy nhiên, không có vấn đề gì tôi cố gắng, tôi dường như không thể để có thể để kết nối với khe chức năng lambda C++ 11.
// C++11
QObject::connect(some_qml_container, SIGNAL(foo()), [=]() { /* response */ }); // fails...
QObject::connect(some_qml_container, "foo()", [=]() { /* response */ }); // fails...
Cả hai lần thử không thành công với lỗi chữ ký hàm (không QObject :: kết nối quá tải có thể chấp nhận các thông số này). Tuy nhiên, tài liệu Qt 5 ngụ ý rằng điều này có thể xảy ra.
Thật không may, Qt 5 ví dụ luôn luôn kết nối C++ tín hiệu đến một C++ khe lambda:
// C++11
QObject::connect(some_qml_container, &QMLContainer::foo, [=]() { /* response */ }); // works!
Cú pháp này không thể làm việc cho một tín hiệu QML, như QMLContainer :: chữ ký foo không biết tại thời gian biên dịch (và tuyên bố QMLContainer :: foo bằng tay đánh bại mục đích sử dụng QML ngay từ đầu.)
Tôi đang cố gắng làm điều gì? Nếu vậy, cú pháp chính xác cho cuộc gọi kết nối QObject :: là gì?
Cảm ơn câu trả lời, điều này mang lại cho tôi một hướng đi mới để tìm câu trả lời: có thể nhận con trỏ C++ tới tín hiệu QML không? Nếu vậy, tôi có thể liên kết một hàm std :: với tín hiệu và lambda vào khe. Thật không may, việc phản ánh mọi tín hiệu QML thành C++ QObject được cho là một thiết kế tồi tệ hơn chỉ xác định các khe trong QObjects (tức là cách tiếp cận trường cũ). Những gì tôi muốn làm là tránh sử dụng QObjects hoàn toàn, tận dụng lợi thế của giao diện Qt 5 mới (có thể hoặc có thể không được). –
Vâng, có các kết nối tín hiệu tín hiệu xảy ra tự động có thể có nghĩa là nó chỉ là một dòng mã bổ sung, giống như dòng này sau khi khai báo trình xem QML: 'MyQMLSignalRouter qmlSignals (& myQmlView.rootObject());' và sau đó sử dụng 'qmlSignals' trong kiểu kết nối cuộc gọi. Các tín hiệu QML không tồn tại dưới dạng các hàm C++, chúng không thể (chúng là động, C++ là tĩnh) để nhận được một con trỏ phương thức trực tiếp đến chúng thậm chí không có lý thuyết, theo như tôi hiểu nó. – hyde
Sự hoài nghi của tôi đối với phương pháp này nằm trong sự liên kết chặt chẽ giữa các tín hiệu QML và mã C++ mà nó giới thiệu, cũng như cách tiếp cận "siêu hạng" đơn lẻ (một lớp để khai báo tất cả các tín hiệu, ở khắp mọi nơi). Nó có mùi hôi! Bạn hoàn toàn đúng rằng các tín hiệu QML không có sẵn cho C++ tĩnh. Tuy nhiên, giải pháp động có thể tồn tại: QQuickItem :: metaObject() -> indexOfSignal ("foo()") trả về chính xác chỉ mục của tín hiệu đó. AFAICT, hệ thống ống nước để có được một wrapper có thể gọi được cũng tồn tại, nhưng ẩn bên trong không gian tên QtPrivate. Rất tiếc. –