หลังจากผ่านไป 18 เดือน ... ฉันเริ่มแสดงความคิดเห็นใต้คำตอบของ @ Mat และกำลังจะหมดห้องอย่างรวดเร็ว ดังนั้นคำตอบ
IMO emit
ไม่ใช่ทั้งน้ำตาลที่เป็นประโยคและคำหลักง่ายๆในแง่นั้น
- มันสร้างรหัส (ตามคำอธิบายของ @Mat ด้านบน)
- ช่วยให้
connect
กลไกรับรู้ว่าแท้จริงแล้วคือ a signal
และ
- ทำให้สัญญาณของคุณเป็นส่วนหนึ่งของระบบที่ "ใหญ่กว่า" ซึ่งสัญญาณและการตอบสนอง (สล็อต) สามารถดำเนินการแบบซิงโครนัสหรืออะซิงโครนัสหรือเข้าคิวขึ้นอยู่กับตำแหน่งและวิธีการปล่อยสัญญาณ นี่เป็นคุณสมบัติที่มีประโยชน์อย่างยิ่งของระบบสัญญาณ / สล็อต
ระบบสัญญาณ / สล็อตทั้งหมดเป็นสำนวนที่แตกต่างจากการเรียกใช้ฟังก์ชันธรรมดา ฉันเชื่อว่ามันเกิดจากรูปแบบของผู้สังเกตการณ์ นอกจากนี้ยังมีความแตกต่างที่สำคัญระหว่าง a signal
และ a slot
: ไม่จำเป็นต้องใช้สัญญาณในขณะที่สล็อตต้องเป็น !
คุณกำลังเดินไปตามถนนและเห็นบ้านหลังหนึ่งถูกไฟไหม้ (สัญญาณ) คุณกด 911 ( เชื่อมต่อสัญญาณไฟกับช่องตอบกลับ 911 ) สัญญาณถูกปล่อยออกมาเท่านั้นในขณะที่หน่วยดับเพลิงได้รับการติดตั้ง อาจจะไม่ชัดเจน แต่คุณเข้าใจ มาดูตัวอย่าง OP
วัตถุแบ็กเอนด์บางตัวรู้ว่ามีความคืบหน้ามากเพียงใด มันก็emit progressNotification(...)
ส่งสัญญาณได้ ขึ้นอยู่กับคลาสที่แสดงแถบความคืบหน้าจริงเพื่อรับสัญญาณนี้และดำเนินการกับมัน แต่มุมมองเชื่อมต่อกับสัญญาณนี้อย่างไร? ยินดีต้อนรับสู่ระบบสัญญาณ / สล็อตของ Qt หนึ่งสามารถตอนนี้ตั้งครรภ์ของชั้นผู้จัดการ (โดยปกติจะเป็นเครื่องมือของการเรียงลำดับ) ซึ่งประกอบไปด้วยมุมมองวัตถุและข้อมูลการคำนวณวัตถุ (ทั้งเป็นQObjects
) connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
อาจดำเนินการ
อย่าเข้าสู่ด้านการออกแบบของคลาสผู้จัดการ แต่พอจะบอกได้ว่านี่คือจุดที่ระบบสัญญาณ / สล็อตส่องสว่าง ฉันสามารถมุ่งเน้นไปที่การออกแบบสถาปัตยกรรมที่สะอาดมากสำหรับแอปพลิเคชันของฉัน ไม่เสมอไป แต่บ่อยครั้งที่ผมพบว่าผมแค่ปล่อยสัญญาณ แต่ใช้ช่อง
หากเป็นไปได้ที่จะใช้ / เรียกใช้วิธีการส่งสัญญาณโดยไม่เคยเปล่งออกมาแสดงว่าคุณไม่จำเป็นต้องใช้ฟังก์ชันนั้นเป็นสัญญาณตั้งแต่แรก
emit
ไม่จำเป็น เป็นเรื่องแปลกที่คุณได้เรียนรู้เกี่ยวกับการemit
เรียกสัญญาณโดยตรงมาเป็นเวลานานเนื่องจากระบบช่องสัญญาณเป็นหนึ่งในสิ่งแรก ๆ ที่ต้องเรียนรู้เกี่ยวกับ Qt