Có cách nào để sử dụng bất kỳ hàm C++ nào làm khe Qt không có lớp kế thừa từ QWidget không?Sử dụng bất kỳ chức năng C++ nào như một khe Qt
Trả lời
Bạn không thể trong Qt phiên bản < Qt 5.
Để sử dụng tín hiệu/khe trình biên dịch đối tượng meta phải được gọi. Để thực hiện điều này lớp học của bạn phải đáp ứng các yêu cầu sau:
- Kế thừa từ
QObject
hay bất kỳ lớp con khác (ví dụQWidget
,QPushButton
vv) - vĩ mô
Q_OBJECT
cần được xác định trong phần private của lớp theo thứ tự để cho phép các tính năng meta-đối tượng như khe - Sử dụng
Qt
từ khóaslots
vàsignals
để tuyên bố mà chức năng nên xử lý bởi trình biên dịch meta như khe hoặc tín hiệu
Để biết thêm chi tiết kiểm tra các trang tài liệu tương ứng về và signals & slots
Ngoài ra kiểm tra tài liệu QObject
:
Chú ý rằng
Q_OBJECT
vĩ mô là bắt buộc đối với bất kỳ đối tượng mà thực hiện tín hiệu, khe hoặc tính chất. Bạn cũng cần chạy Trình đối tượng meta trên tệp nguồn. Chúng tôi khuyên bạn nên sử dụng của macro này trong tất cả các lớp con của QObject bất kể có hay không không thực sự sử dụng tín hiệu, vị trí và thuộc tính, vì không thực hiện được một số chức năng nhất định.
Chỉnh sửa: Vì biểu thức Qt 5, functors và lambda có thể được sử dụng làm vị trí. Xem New Signal Slot Syntax in Qt 5
Quan trọng, tuy nhiên, trong khi điều này là không thể trong Qt 4, nó sẽ để có thể trong Qt 5, sử dụng cơ chế tín hiệu/khe cắm mới. http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir
Bạn nói đúng, nhưng IMHO nó chỉ nên được sử dụng trong những trường hợp hiếm hoi. Sử dụng các khe cắm thanh lịch hơn bằng cách sử dụng tr1 :: liên kết với các hàm đơn giản. – pnezis
tôi hoàn toàn đồng ý, họ phải là một sự xuất hiện hiếm có. Rất giống như cirquit ngắn nếu phát biểu, chúng rất hữu ích trong một số trường hợp rất hẹp, và trong những trường hợp đó tăng khả năng đọc và dễ bảo trì. Nhưng, họ chỉ nên được sử dụng sau đó, không phải là một quy tắc chung. – leinir
Không chắc chắn. Qt-meta-object-compiler (moc) kết thúc tốt chức năng, được đánh dấu là khe -s, trong trình bao bọc mã tương đối lớn. Các tệp, được tạo bởi moc, bắt đầu bằng moc_, xem chúng.
Nó là đủ để kế thừa QObject: http://qt-project.org/doc/qt-4.8/signalsandslots.html
Trong Qt 5, bạn có thể. Xem http://qt-project.org/wiki/New_Signal_Slot_Syntax
Trong Qt 4, điều này không được hỗ trợ trực tiếp nhưng có một vài thư viện cung cấp chức năng này bằng cách ủy quyền tín hiệu qua khe trong QObject ẩn, sau đó gọi chức năng không có khe của bạn. Nỗ lực của tôi tại đây có thể được tìm thấy tại https://github.com/robertknight/qt-signal-tools. Có các liên kết đến các triển khai khác ở dưới cùng của README.
Vì biểu thức Qt 5, functors và lambda có thể được sử dụng làm vị trí (như đã đề cập ở đây: http://qt-project.org/wiki/New_Signal_Slot_Syntax).
Như tôi đã không thể tìm thấy mã ví dụ, tôi đã thêm như sau:
Ví dụ này sử boost::function
cho thành viên lớp ClassName::classMember()
không có tham số.
boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance);
connect(QObjectInstance, &QObject::signalName, f);
Khi tín hiệu và đẳng cấp thành viên Qt có thông số (ví dụ ClassName::classMember(int)
), chức năng tăng nên được điều chỉnh như sau:
boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1);
Thông tin thêm về boost :: ràng buộc có thể được tìm thấy trong tài liệu: http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html
- 1. Bất kỳ ý tưởng nào để chạy tín hiệu/khe Qt qua mạng?
- 2. Qt thực hiện tín hiệu và khe như thế nào?
- 3. Sử dụng phát ra vs gọi một tín hiệu như thể đó là một chức năng thường xuyên trong Qt
- 4. Khe cắm Python liên kết với bất kỳ IP nào?
- 5. Có bất kỳ tác dụng phụ nào khi sử dụng cho nhiều chức năng tĩnh không?
- 6. cscope giống như chức năng cho C++ (sử dụng vim)
- 7. Qt sử dụng tăng :: shared_ptr trong tín hiệu/khe
- 8. khe qt currying
- 9. Cách sử dụng enums trong tín hiệu và khe Qt
- 10. Connect QML tín hiệu C++ 11 khe lambda (Qt 5)
- 11. Tự động gọi bất kỳ chức năng nào bằng cách chuyển tên hàm như chuỗi
- 12. sử dụng chức năng C trong C#
- 13. Sử dụng std :: chức năng như một đại biểu trong C++ 11
- 14. Làm thế nào để sử dụng các chức năng OpenGL trên một widget OpenGL QT?
- 15. C++ sử dụng chức năng khỏa thân
- 16. Chức năng Razor @helper không hiển thị bất kỳ Html
- 17. C# Tạo và sử dụng Chức năng
- 18. là có bất kỳ chức năng như php phát nổ trong jquery?
- 19. Có bất kỳ lớp container Qt quan sát nào không?
- 20. Chức năng C cụ thể hoạt động như thế nào?
- 21. Khi nào thì sử dụng macro chức năng giống như trong C
- 22. Liệu extern "C" có bất kỳ tác dụng trong C?
- 23. C: Sử dụng chức năng memset
- 24. Qt Creator không thể tìm thấy bất kỳ phiên bản Qt hợp lệ nào
- 25. Tín hiệu C++ vào khe QML trong Qt
- 26. Sử dụng chức năng thành viên lớp như Callback
- 27. Bất kỳ bất lợi nào khi sử dụng ExecuteReaderAsync từ C# AsyncCTP
- 28. Bất kỳ cách nào để "hình dung" một thunk/chức năng? Hoặc làm thế nào để xem một chức năng cho một đối số chung
- 29. Bất kỳ thư viện C/C++ giống như OpenCV nào để xử lý Âm thanh?
- 30. Bất kỳ cách nào để giảm htmlspecialchars() CPU sử dụng?
Tôi không chắc liệu đó có phải là trùng lặp hay không, nhưng điều này có thể hữu ích: http://stackoverflow.com/questions/8533906/ –