วิธีการหมดเวลา QTimer () จะไม่ทำงานอีกต่อไปหลังจากการปรับโครงสร้างโค้ด

ฉันเพิ่งฟอร์แมตโค้ดบางส่วนใหม่เพื่อให้อ่านง่ายขึ้น ฉันมีโค้ดในคลาส MainWindow ของฉันเพื่อจัดการกับเหตุการณ์การสัมผัส ในบรรดาฟังก์ชันเหล่านี้คือฟังก์ชัน pinchZoom ซึ่งทำงานก่อนการเปลี่ยนแปลงของฉัน ฉันย้ายโค้ดไปที่คลาสซิงเกิลตันซึ่งเป็น QObject แทน

เมื่อตรวจพบ pinchZoom วิดเจ็ตที่เกี่ยวข้อง (พบโดย QApplication::widgetAt()) จะเรียกใช้เมธอด pinchZoom() ซึ่งจะหยุดแล้วรีสตาร์ท QTimer แบบช็อตเดียว เมธอด timeout() ของ QTimer เชื่อมต่อกับสล็อตซึ่งจะทำการซูมจริงและอัปเดตมุมมอง นี่เป็นสิ่งที่ฉันสามารถเพิ่มความล่าช้าระหว่างท่าทางการบีบนิ้วจริงและการอัปเดตมุมมอง

ก่อนที่จะย้ายโค้ดของฉัน สัญญาณ timeout() นี้ทำงานได้ดี และวิธีการซูมก็เริ่มทำงาน อย่างไรก็ตาม แม้ว่าจะไม่ได้สัมผัสกับการเชื่อมต่อสัญญาณ/สล็อต ช่องการซูมที่ถูกทริกเกอร์โดยวิธี timeout() จะไม่ถูกเรียกอีกต่อไป การเชื่อมต่อจริงระหว่างสัญญาณ timeout() และสล็อตเสร็จสิ้นในตัวสร้างของวิดเจ็ตที่มีตัวจับเวลาอยู่

ฉันได้ตรวจสอบแล้ว และการเชื่อมต่อสัญญาณ/สล็อตกลับมาเป็นจริง ดังนั้นจึงมีการเชื่อมต่ออยู่

มีเหตุผลบางอย่างที่สิ่งนี้จะเกิดขึ้นหรือไม่? มันเกี่ยวข้องกับความจริงที่ว่า QTimer ที่กำลังเริ่มต้นกำลังเกิดขึ้นภายในคลาสซิงเกิลตันแทนที่จะเป็นคลาส MainWindow หรือไม่?


person Darin Beaudreau    schedule 01.08.2019    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าปัญหาคือคลาสซิงเกิลตันของฉันอยู่ในเธรดแยก และไม่สามารถทริกเกอร์ QTimer จากเธรดแยกได้ ฉันเพิ่งตั้งค่าช่องในคลาส MainWindow ดั้งเดิมเพื่อรับสัญญาณจากคลาสซิงเกิลตันแล้วเรียกวิธีการซูมแบบหยิก ทำงานได้ดีตอนนี้

person Darin Beaudreau    schedule 01.08.2019