Sau 18 tháng ... Tôi bắt đầu với nhận xét trong câu trả lời của @ Mat và đã hết của phòng một cách nhanh chóng. Vì vậy, câu trả lời.
IMO emit
không phải là cú pháp đường hay một từ khóa đơn giản theo nghĩa là
- Nó tạo mã (như được giải thích bởi @Mat ở trên),
- Nó giúp các cơ chế
connect
công nhận rằng thực sự nó là một signal
và
- Nó làm cho phần tín hiệu của bạn trở thành một hệ thống "lớn hơn", nơi tín hiệu và phản hồi (khe) có thể được thực hiện đồng bộ hoặc không đồng bộ hoặc xếp hàng, tùy thuộc vào vị trí và cách tín hiệu phát ra. Đây là một tính năng cực kỳ hữu ích của hệ thống tín hiệu/khe.
Toàn bộ hệ thống tín hiệu/khe là thành ngữ khác với lệnh gọi hàm đơn giản. Tôi tin rằng nó bắt nguồn từ mô hình quan sát viên. Ngoài ra còn có sự khác biệt chính giữa một số signal
và slot
: tín hiệu không có để được triển khai, trong khi một vị trí phải là!
Bạn đang đi bộ xuống phố và nhìn thấy ngôi nhà đang cháy (tín hiệu). Bạn quay số 911 (kết nối tín hiệu báo cháy với khe phản hồi 911). Tín hiệu là chỉ phát ra, trong khi vị trí được triển khai bởi bộ phận cứu hỏa. Có thể không chính xác, nhưng bạn có ý tưởng. Hãy xem ví dụ về OP.
Một số đối tượng phụ trợ biết số lượng tiến trình đã được thực hiện. Vì vậy, nó có thể chỉ đơn giản là tín hiệu emit progressNotification(...)
. Tùy thuộc vào lớp hiển thị thanh tiến trình thực tế, để nhận tín hiệu này và thực hiện trên đó. Nhưng quan điểm kết nối với tín hiệu này như thế nào? Chào mừng bạn đến với hệ thống tín hiệu/khe của Qt. Giờ đây, người ta có thể hình dung một lớp người quản lý (thường là một loại tiện ích), bao gồm đối tượng xem và đối tượng tính toán dữ liệu (cả hai là QObjects
), có thể thực hiện connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Chúng ta không đi vào các khía cạnh thiết kế của lớp người quản lý, nhưng đủ để nói rằng đây là nơi hệ thống tín hiệu/khe phát sáng. Tôi có thể tập trung vào việc thiết kế một kiến trúc rất sạch sẽ cho ứng dụng của mình. Không phải luôn luôn, nhưng thường xuyên, tôi thấy rằng tôi chỉ phát ra tín hiệu nhưng thực hiện các vị trí.
Nếu chúng ta có thể sử dụng/gọi một phương thức tín hiệu mà không bao giờ phát ra nó, sau đó nó nhất thiết ngụ ý rằng bạn không bao giờ cần chức năng đó như là một tín hiệu ở nơi đầu tiên.
+1 Không bao giờ biết 'emit' là không cần thiết. Thật lạ lùng, rằng bạn đã học được về 'emit' lâu sau khi gọi tín hiệu trực tiếp, vì hệ thống khe cắm tín hiệu là một trong những điều đầu tiên được học về Qt. –