คำตอบสั้น ๆ
MVC ของ Qt ใช้กับโครงสร้างข้อมูลเดียวเท่านั้น เมื่อพูดถึง MVC แอพลิเคชันที่คุณไม่ควรคิดเกี่ยวกับหรือQAbstractItemModel
QListView
หากคุณต้องการสถาปัตยกรรม MVC สำหรับโปรแกรมทั้งหมดของคุณ Qt ไม่มีโมเดล / มุมมอง "ขนาดใหญ่" แต่สำหรับแต่ละรายการ / โครงสร้างข้อมูลในโปรแกรมของคุณคุณสามารถใช้แนวทาง Qt MVC ซึ่งมีตัวควบคุมอยู่ในมุมมองของมัน ข้อมูลที่อยู่ภายในหรือภายนอกของรูปแบบ; ขึ้นอยู่กับประเภทของโมเดลที่คุณใช้ (คลาสย่อยของโมเดลของตัวเอง: อาจจะอยู่ในโมเดลเช่น QSqlTableModel: ภายนอก (แต่อาจถูกแคชไว้ภายใน) โมเดล) ที่จะนำรูปแบบและมุมมองของคุณร่วมกันใช้คลาสของตัวเองซึ่งก็ใช้ตรรกะทางธุรกิจ
คำตอบยาว
รูปแบบ / แนวทางการดูและคำศัพท์ของ Qt:
Qt ให้มุมมองที่เรียบง่ายสำหรับโมเดลของพวกเขา พวกเขามีตัวควบคุมในตัว: การเลือกแก้ไขและย้ายรายการเป็นสิ่งที่โดยส่วนใหญ่แล้วคอนโทรลเลอร์ "ควบคุม" นั่นคือการตีความอินพุตของผู้ใช้ (การคลิกและย้ายเมาส์) และให้คำสั่งที่เหมาะสมกับโมเดล
โมเดลของ Qt เป็นโมเดลที่มีข้อมูลพื้นฐาน แน่นอนว่าโมเดลนามธรรมจะไม่เก็บข้อมูลเนื่องจาก Qt ไม่รู้ว่าคุณต้องการจัดเก็บอย่างไร แต่คุณขยาย QAbstractItemModel ตามความต้องการของคุณโดยการเพิ่มที่เก็บข้อมูลของคุณไปยังคลาสย่อยและทำให้อินเทอร์เฟซโมเดลเข้าถึงข้อมูลของคุณ ในความเป็นจริงและฉันถือว่าคุณไม่ชอบสิ่งนี้ปัญหาคือคุณต้องตั้งโปรแกรมแบบจำลองดังนั้นวิธีการเข้าถึงและแก้ไขข้อมูลในโครงสร้างข้อมูลของคุณ
ใน MVC ศัพท์รูปแบบมีทั้งข้อมูลและตรรกะ ใน Qt นั้นขึ้นอยู่กับคุณว่าคุณจะรวมตรรกะทางธุรกิจบางอย่างไว้ในโมเดลของคุณหรือไม่หรือวางไว้ภายนอกโดยเป็น "มุมมอง" ในตัวของมันเอง ยังไม่ชัดเจนว่าตรรกะหมายถึงอะไร: การเลือกเปลี่ยนชื่อและย้ายรายการไปรอบ ๆ ? => ดำเนินการแล้ว ทำการคำนวณกับพวกเขาหรือไม่? => วางไว้ด้านนอกหรือด้านในคลาสย่อยของโมเดล การจัดเก็บหรือโหลดข้อมูลจาก / ไปยังไฟล์? => ใส่ไว้ในคลาสย่อยของโมเดล
ความคิดเห็นส่วนตัวของฉัน:
เป็นเรื่องยากมากที่จะจัดหาระบบMV (C) ที่ดีและทั่วไปให้กับโปรแกรมเมอร์ เนื่องจากในกรณีส่วนใหญ่โมเดลนั้นเรียบง่าย (เช่นเฉพาะรายการสตริง) Qt ยังมี QStringListModel ที่พร้อมใช้งาน แต่ถ้าข้อมูลของคุณซับซ้อนกว่าสตริงขึ้นอยู่กับว่าคุณต้องการแสดงข้อมูลผ่านอินเทอร์เฟซ Qt model / view อย่างไร ตัวอย่างเช่นหากคุณมีโครงสร้างที่มี 3 ฟิลด์ (สมมติว่าบุคคลที่มีชื่ออายุและเพศ) คุณสามารถกำหนด 3 ฟิลด์ให้กับ 3 คอลัมน์ที่แตกต่างกันหรือ 3 บทบาทที่แตกต่างกัน ฉันไม่ชอบทั้งสองวิธี
ผมคิดว่ากรอบรูปแบบ / มุมมอง Qt เป็นประโยชน์ก็ต่อเมื่อคุณต้องการแสดงโครงสร้างข้อมูลที่เรียบง่าย จะจัดการได้ยากหากข้อมูลเป็นประเภทที่กำหนดเองหรือมีโครงสร้างไม่อยู่ในโครงสร้างหรือรายการ (เช่นกราฟ) ในกรณีส่วนใหญ่รายการจะเพียงพอและในบางกรณีแบบจำลองควรมีรายการเดียวเท่านั้น โดยเฉพาะอย่างยิ่งถ้าคุณต้องการสร้างแบบจำลองรายการเดียวที่มีแอตทริบิวต์ที่แตกต่างกัน (หนึ่งอินสแตนซ์ของคลาสหนึ่ง) กรอบรูปแบบ / มุมมองของ Qt ไม่ใช่วิธีที่ถูกต้องในการแยกตรรกะออกจากอินเทอร์เฟซผู้ใช้
เพื่อสรุปสิ่งขึ้นผมคิดว่ากรอบรูปแบบ / มุมมองน่ารักจะเป็นประโยชน์ถ้าหากข้อมูลของคุณจะถูกมองโดยหนึ่งในQt ของวิดเจ็ตของผู้ชม จะไม่มีประโยชน์เลยหากคุณกำลังจะเขียนโปรแกรมดูภาพของคุณเองสำหรับโมเดลที่มีเพียงรายการเดียวเช่นการตั้งค่าแอปพลิเคชันของคุณหรือหากข้อมูลของคุณไม่ใช่ประเภทที่พิมพ์ได้
ฉันใช้ Qt model / view ภายในแอปพลิเคชัน (ใหญ่กว่า) ได้อย่างไร
ฉันเคยเขียน (ในทีม) แอปพลิเคชันที่ใช้โมเดล Qt หลายตัวเพื่อจัดการข้อมูล เราตัดสินใจสร้างDataRole
เพื่อเก็บข้อมูลจริงซึ่งเป็นประเภทกำหนดเองที่แตกต่างกันสำหรับคลาสย่อยแต่ละรุ่น เราสร้างคลาสโมเดลภายนอกที่เรียกว่าการModel
ถือโมเดล Qt ที่แตกต่างกันทั้งหมด นอกจากนี้เรายังสร้างระดับมุมมองด้านนอกที่เรียกว่าView
การถือครองหน้าต่าง (วิดเจ็ต) Model
ที่เชื่อมต่อกับรุ่นภายใน ดังนั้นแนวทางนี้จึงเป็น Qt MVC แบบขยายซึ่งปรับให้เข้ากับความต้องการของเราเอง ทั้งสองModel
และView
ชั้นเรียนเองไม่มีส่วนเกี่ยวข้องกับ Qt MVC
เราวางตรรกะไว้ที่ไหน เราสร้างคลาสที่ทำการคำนวณจริงกับข้อมูลโดยการอ่านข้อมูลจากโมเดลต้นทาง (เมื่อมีการเปลี่ยนแปลง) และเขียนผลลัพธ์ลงในโมเดลเป้าหมาย จากมุมมองของ Qt คลาสลอจิกนี้จะเป็นมุมมองเนื่องจาก "เชื่อมต่อ" กับโมเดล (ไม่ใช่ "มุมมอง" สำหรับผู้ใช้ แต่เป็น "มุมมอง" สำหรับส่วนตรรกะทางธุรกิจของแอปพลิเคชัน)
ตัวควบคุมอยู่ที่ไหน? ในคำศัพท์ MVC ดั้งเดิมคอนโทรลเลอร์จะตีความอินพุตของผู้ใช้ (เมาส์และคีย์บอร์ด) และให้คำสั่งกับโมเดลเพื่อดำเนินการตามที่ร้องขอ เนื่องจากมุมมอง Qt ตีความอินพุตของผู้ใช้เช่นการเปลี่ยนชื่อและย้ายรายการจึงไม่จำเป็น แต่สิ่งที่เราต้องการคือการตีความการโต้ตอบของผู้ใช้ซึ่งนอกเหนือไปจากมุมมอง Qt