سؤال

أنا أعمل صغيرة qt التطبيق (باستخدام PyQt4) و قد تأتي مع فكرة ولكن أنا متأكد من كيفية تنفيذ ذلك.لدي QTableView التي تمثل بعض البيانات و أود أن أضيف عمود آخر إلى QTableView الذي يحتوي على عنصر تحكم خانة يمكن أن تكون سلكية تصل إلى بعض قطعة من نموذج.على سبيل المثال, شيء مثل هذا:

alt text

ملاحظة حذف عمود مربع القطعة لكل صف (على الرغم من أن هذا هو التطبيق على شبكة الإنترنت, ليس سطح المكتب Qt التطبيق الرئيسي هو نفسه).نقاط المكافأة إذا كنت يمكن تحديد عدة صفوف, انقر بزر الماوس الأيمن ثم اختر "قم بتحديد/إلغاء تحديد".

إذا كان أي من هذه هو واضح ، إسقاط تعليق هنا وسوف توضيح.

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

المحلول

تنفيذ الجدول الخاص بك نموذج عمل أكثر من استخدام QStandardItemModel (كما @اندي وتوصي), لكنها لا تعطيك غرامة السيطرة على ما تريد القيام به ، لذلك سوف نحاول أن نقدم لك موجزا ماذا تفعل.أفترض أنك تعرف كل شيء عن Qt وثائق و PyQt الدرجة الوثائق ويمكن أن ننظر أي الفئات التي تحتاج إليها.(قد أكون overexplaining إذا كان لديك بالفعل QTableView ولكن أفضل من ترك شيئا, أعتقد.)

للحصول على اختياره الدول:

  • إنشاء فئة فرعية من QTableModel.
    • حدد بعض بنية البيانات لتخزين محتويات الصفوف.وهذا يمكن أن تكون بسيطة جدا (الداخلية الكبيرة القائمة) ، أو معقدة مثل قاعدة بيانات SQL (في هذه الحالة نرى QSqlTableModel بدلا من ذلك).
    • تجاوز rowCount, columnCount, data, ، setData.
      • rowCount و columnCount تتوافق مباشرة إلى حد ما إلى ما كنت تستخدم نموذج البيانات.إذا كنت هي في الأساس باستخدام 2D array (أو قائمة من قوائم) ، فإنها يمكن أن تكون قصيرة بقدر واحد المتشددين.
      • data حيث الحصول على أشياء مثيرة للاهتمام.البند نماذج تخزين العديد من المجالات المختلفة (التي Qt المكالمات أدوار) وما data يعود يعتمد على دور ما يجري طلب.علما أن أتحدث عن أنواع البيانات ما عاد ولكنه يحتاج دائما إلى أن تكون ملفوفة في QVariant.
        • Qt.DisplayRole هو ما يتم عرض النص في خلايا الجدول.هذا هو البيانات الفعلية الخاصة بك, و هو إلى حد بعيد حالة مشتركة (ذلك أن هذا هو دور الافتراضي).
        • Qt.CheckStateRole غير منطقية.العودة Qt.Checked سيتم عرض فحص مربع الاختيار ، Qt.Unchecked سوف يكون دون رادع واحد.إذا كان كل ما تريد العمود لاحتواء هو خانات فقط التعامل مع هذا الدور.
        • في أدوار أخرى مفيدة الرموز ، ألوان الخلفية و عدد من الميزات الأخرى ولكن هذه.
        • أي غير معالج دور يجب أن تعود QVariant.
      • setData هو متماثل إلى data.يجب التعامل مع الأدوار التي تحمل في data: Qt.DisplayRole على البيانات الفعلية ، Qt.CheckStateRole بالنسبة خانات.

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

  • تعيين اختيار الوضعية ، على عرض الجدول: view.setSelectionMode( QAbstractItemView.ContiguousSelection).هذا سوف تمكنك من تسليط الضوء على خلايا متجاورة.يمكنك تسليط الضوء التعسفي الخلايا:انظر QAbstractView.SelectionMode.
  • لتحديد الخلايا التي هي في الواقع اختيارها بعد إجراء نسأل عرض الجدول بالنسبة لها اختيار نموذج (ملاحظة 'l'): view.selectionModel().selectedIndexes().يمكنك من خلال تكرار هذه for حلقة.

للسماح النقر بزر الماوس الأيمن:

  • تجاوز المنظر contextMenuEvent.
  • إنشاء QMenu وتوصيله إلى أي فتحات تحتاج إليها.

من أجل فهم أكثر عمقا قراءة Qt دليل نموذج/عرض إذا كنت لم تقم بذلك بالفعل.و بالتأكيد أن نلقي نظرة على Qt البند أمثلة.العديد من تلك التي تصف يتم تنفيذها في PyQt في أقل من ذلك بكثير رمز (بما في ذلك اثنين @جيسي يذكر) ، نموذج شجرة أمثلة تحمل أكثر من الجداول ولكن مع أقل بكثير من العمل (تحتاج إلى تنفيذ أقل من ذلك بكثير ، كما هو موضح أعلاه.)

نصائح أخرى

هل يمكن أن يكون أيضا نظرة على QStandardItemModel، والتي تعطيك واجهة للتفاعل مع العناصر من خلال دولة "قابلة للتحديد"!

ويمكنك أيضا أن ترث من QAbstractItemModel واستخدام دور كيو تي :: CheckStateRole ...

في كيو تي / C ++ يمكنك إنشاء مندوب لبنود مخصصة في عمود. أفترض أنك تستطيع أن تفعل شيئا من هذا القبيل جدا في باي كيوت. راجع الأمثلة التالية:

ستار مندوب مثال
سبين صندوق مندوب مثال

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