كيفية استخدام إطار عمل QT/عرض مع إطار عرض الرسومات
-
02-10-2019 - |
سؤال
أنا أعمل على تطبيق رسم الخرائط وأحتاج إلى عرض كائنات البيانات باستخدام جدول ونموذج وكأشياء رسومية في الخريطة. أنا أستخدم PYQT ، لكن هذا ليس مهمًا حقًا لأن هذا سؤال QT وليس سؤالًا بيثون.
إذا كنت بحاجة فقط إلى الجدول وتشكيل مشاهدات ، فسيكون ذلك سهلاً ، سأستخدم فقط إطار عمل QT/View. ومع ذلك ، فأنا بحاجة إلى عرض الخريطة لتوفير الوظائف المتاحة حقًا فقط باستخدام إطار عرض الرسومات ، وهو في الأساس إطار عمل/عرض خاص مع QGraphicsScene الذي يعمل كنموذج بيانات.
أستطيع أن أفكر في طريقتان للقيام بذلك. يمكن للمرء أن يبدأ بنموذج موثوق فئة فرعية من QabstractItemModel ، وربطه بالفئة الفرعية من QabstractItemView ومن هناك إنشاء وتحديث QGraphicsItems في المشهد. هذا يبدو قبيحًا لأنني لست متأكدًا من كيفية التعامل مع تفاعل المستخدم مع عناصر البيانات والتغييرات على الرغم من التفاعل مع QGraphicsItems.
الطريقة الأخرى التي يمكنني التفكير فيها هي التعامل مع QGraphicsScene كمصدر للبيانات الموثوق ، وتخزين كائن البيانات في خاصية .DATA () من كل QGraphicSitem. سأقوم بعد ذلك بتكليف QabstractItemModel وأكتبها بحيث تصل إلى البيانات الموجودة في المشهد لأنها تخزن البيانات ، فإن المشاهدات الأخرى ستستخدم هذا كنموذجها. كيف يمكنني نشر التغييرات على البيانات في المشهد حتى النموذج؟
بغض النظر عن النهج الذي أتبعه ، يبدو أن هناك فجوة لا يتم التعامل معها بواسطة الأطر. في النموذج/العرض ، يُفترض أن يتم إجراء جميع التغييرات في النموذج. في عرض الرسومات ، يُفترض أن يتم إجراء جميع التغييرات في المشهد.
لذا ، ما هو النهج الذي ستختار QabstractItemModel (موثوق)-> QabstractItemView-> QGraphicsScene أو QGraphicsscene (موثوق)-> QabstractItemModel-> طرق عرض أخرى. لماذا تختار أحدهم على الآخر وما هي gotchas التي تتوقعها؟ هل احتاج أي شخص آخر إلى سد هذه الفجوة بين أطر عمل/عرض الطراز التوأم الخاص بـ QT وكيف فعلت ذلك؟
المحلول
QabstractItemModel (موثوق)-> QabstractItemView-> QGraphicsScene
بدون أدنى شك. لقد فعلت هذا من قبل ، فهذا يتطلب القليل من الازدواجية (على الأقل بعض ما لم أستطع تجنبه) ولكن لا شيء سيء للغاية.
يتيح لك ذلك أيضًا تمثيل بياناتك في طرق العرض القياسية إلى جانب المشهد الذي يعد لطيفًا جدًا.
أفضل نصيحة لي هي تخزين أ QHash
من QPersistantModelIndex
إلى QGraphicsItem
و QGraphicsScene
في ال QAbstractItemView
انت صنعت. هذا يتيح لك الذهاب بسرعة بين الأراضي النموذجية/عرض (QModelIndex
) لعرض الرسومات الأرض (QGraphicsItem
)