معظم الحل أناقة / آمنة / سهلة لتخزين وتحرير (GUI) هيكل شجرة يشبه الدليل؟

StackOverflow https://stackoverflow.com/questions/1882666

سؤال

لدي مشكلة صعبة قليلا لحلها؛ تخيل هذا:

يحتاج أحد التطبيقات الخاصة بي إلى الاستفادة الشديدة من البرمجة النصية، لذلك كانت فكرتي هي توفير المستخدم طريقة لكتابة مقتطفات البرنامج النصي وتنظيمها في بنية شجرة تشبه الدليل. هذا يشبه إلى حد كبير دليل التعليمات البرمجية المصدر مع الدلائل الفرعية والملفات المصدر.

طبق البيانات / تخزين

المشكلة الأولى التي صادفتها هي أنني بحاجة إلى إيجاد طريقة جيدة لتخزين هيكل الأشجار بأكملها (على القرص، داخل التطبيق في وقت التشغيل). لذلك كان لدي هذه الأفكار:

  1. استخدم فئة مشتقة من QOOBJECT يمكن أن تمثل الشجرة باستخدام ميزات الوالد / الطفل QOOBJECT. وبهذه الطريقة لا داعي للقلق بشأن حذف هذه الأشياء إذا تم حذف الآباء.
  2. استخدم فئة بسيطة قد تحتوي على qlist (بدون مؤشرات) للأطفال وبعض الخصائص التي تخزن خصائص كل مجموعة / برنامج نصي.
  3. استخدم النهج رقم 2، ولكن استخدام المؤشرات بدلا من الكائنات الثابتة - هذا من شأنه تجنب نسخ عديمة الفائدة عندما لا بد لي من اجتياز مجموعة أو جزء من شجرة إلى وظيفة، إلخ.
  4. استخدم Backend Live إلى قاعدة بيانات SQLite (أو ما شابه)، واستعلامها عند وقت التشغيل. هذا من شأنه تجنب تحميل الشجرة بأكملها مرة واحدة والحفاظ عليها في ذاكرة الوصول العشوائي.
  5. استخدم ملفا مسطح وبنية الدليل على نظام الملفات؛ على الرغم من أنني أعتقد أن هذا يدخل مشكلة أكثر من اللازم لأنه لا توجد وسيلة لتخزين معلومات التعريف حول الكائنات.

محرر

المشكلة التالية التي صادفتها هي حقيقة أن المستخدم ربما يريد تحرير هيكل الأشجار بأكمله. إنه يريد النقر على مجموعة أو برنامج نصي، قم بتحرير رمز البرنامج النصي وربما سحب وإفلات الدلائل والبرامج النصية داخل الشجرة؛ وبالتالي تغيير هيكل الشجرة كلها في الطريق.

هذا يثير المشاكل التالية:

  1. إذا أغلق المستخدم المحرر، فقد يكون ذلك فكرة جيدة لتزويده ب "هل تريد حفظ التغييرات؟" الحوار. يشبه إلى حد كبير محرر نصوص حيث تمت كتابة شيء بطريق الخطأ في مستند موجود، لكنك تركت دون حفظ التغييرات. - سيتطلب ذلك أن نقوم بتحرير نسخة من الشجرة بأكملها، والكتابة فوق الشجرة الموجودة داخل التطبيق عند الحاجة.
  2. السماح بالسحب والإفلات يمكن أن يكون مشكلة ...
    • ... مع ال نهج التخزين رقم 1: حاليا ليست هناك طريقة جيدة لتغيير ترتيب الأطفال من QOOBJECS. أيضا تتحرك الكائنات حولها في وقت التشغيل أثناء الوصول إلى أجزاء أخرى من البرنامج ليست فكرة جيدة.
    • ... هذا أسهل مع نهج التخزين رقم 2, ، نظرا لأن الشجرة بأكملها تتعامل معها مثل قيمة واحدة ولا يوجد أطفال يجب علي التحرك وإعادة الوالدين. نسخ جزء من الشجرة يقوم تلقائيا بنسخ جميع الأطفال وما إلى ذلك. لسوء الحظ، هذا يعني الكثير من النفقات العامة والخسارة في المرونة (يجب أن أكتب الشجرة بأكملها على القرص مرة أخرى لأنني لا أستطيع التأكد من تغييرها بالضبط).

ربما سأتحديث هذا السؤال قليلا عندما تأتي المزيد من الأشياء في ذهني، لكنني فضولي حقا كيف يحل الآخرين هذه المشكلة. أي اقتراحات وأفكار موضع تقدير. :)

هل كانت مفيدة؟

المحلول 2

الآن لحل المشكلة عن طريق الحد من عمق الشجرة باستخدام فصول مخصصة. هذا يعني أنه لا يوجد سوى كمية محدودة من عمق الشجرة الذي يحتاج إلى التعامل معه، لذلك أنا ببساطة يمكنني استخدام QTREETreeWidget وبعض طرق المساعد التي تسمح بالفرز والسحب والإفلات وغيرها من الميزات الرائعة.

نصائح أخرى

أقترح عليك إلقاء نظرة على QfilesystemModel للممارسات الجيدة. يجب على النموذج تحديث نفسه باستخدام مؤشر ترابط منفصل لاستجابة واجهة المستخدم، والحفاظ على ذاكرة التخزين المؤقت وهلم جرا. يجب أن يجعل نموذج تصرفي جيدا عملك على المحرر أسهل.

سأذهب أيضا إلى اشتقاق QOOBJECT لإنشاء فصول Treeitem. بيانات مشتركة مثيرة مع Qshareddata للحصول على فئة أساسية ستكون لطيفة. سيكون لدي أيضا خاصية لأمرها. بهذه الطريقة عندما يسحب المستخدم وينقط أو تغيير الطلب بأي طريقة أخرى لديك طريقة للحفاظ على التحكم. نظرا لأن البيانات مشتركة، فإن إبقاء قائمة الكائنات الخاصة بك في طلبك لن يكون لها تكلفة ضئيلة.

أيضا، إلقاء نظرة على modeltest..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top