Sau 18 tháng ... tôi bắt đầu nhận xét dưới câu trả lời của @ Mat, và nhanh chóng hết chỗ. Như vậy câu trả lời.
IMO emit
không phải là đường cú pháp cũng không phải là một từ khóa đơn giản theo nghĩa
- Nó tạo mã (như được giải thích bởi @Mat ở trên),
- Nó giúp
connect
cơ chế nhận ra rằng nó thực sự là một signal
, và
- Nó làm cho tín hiệu của bạn trở thành một phần của hệ thống "lớn hơn", nơi các tín hiệu và phản hồi (khe cắm) có thể được thực thi đồng bộ hoặc không đồng bộ hoặc xếp hàng đợi, tùy thuộc vào vị trí và cách tín hiệu được 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 cắm.
Toàn bộ hệ thống tín hiệu / khe cắm là một thành ngữ khác với một cách gọi hàm đơn giản. Tôi tin rằng nó bắt nguồn từ mẫu người quan sát. Ngoài ra còn có một sự khác biệt lớn giữa a signal
và a slot
: một tín hiệu không cần phải được triển khai, trong khi phải có một khe cắm !
Bạn đang đi bộ xuống phố và thấy một ngôi nhà đang bốc cháy (một 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 chỉ được phát ra , trong khi khe cắm đã được thực hiện bởi cơ quan 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.
Đối tượng phụ trợ nào đó biết tiến trình đã được thực hiện. Vì vậy, nó có thể chỉ đơn giản là emit progressNotification(...)
báo hiệu. 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 thi trên nó. Nhưng làm thế nào để khung nhìn kết nối với tín hiệu này? Chào mừng đến với hệ thống tín hiệu / khe cắm của Qt. Bây giờ người ta có thể quan niệm về một lớp người quản lý (thường là một widget của các loại), bao gồm một đối tượng xem và một đối tượng tính toán dữ liệu (cả hai đều là QObjects
), có thể hoạt động connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Chúng ta đừng đi sâu 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 khe cắm / tín hiệu tỏa sáng. Tôi có thể tập trung vào việc thiết kế một kiến trúc rất rõ ràng cho ứng dụng của mình. Không phải lúc nào cũng vậy, nhưng đôi khi, tôi thấy rằng tôi chỉ phát ra tín hiệu nhưng thực hiện các khe cắm .
Nếu 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ó , thì điều đó nhất thiết ngụ ý rằng ngay từ đầu bạn chưa bao giờ cần đến chức năng đó như một tín hiệu .
emit
là không cần thiết. Tuy nhiên, thật lạ là bạn đã học đượcemit
rất 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 tìm hiểu về Qt.