تضمين التحكم في QTableView?
سؤال
أنا أعمل صغيرة qt التطبيق (باستخدام PyQt4) و قد تأتي مع فكرة ولكن أنا متأكد من كيفية تنفيذ ذلك.لدي QTableView التي تمثل بعض البيانات و أود أن أضيف عمود آخر إلى QTableView الذي يحتوي على عنصر تحكم خانة يمكن أن تكون سلكية تصل إلى بعض قطعة من نموذج.على سبيل المثال, شيء مثل هذا:
ملاحظة حذف عمود مربع القطعة لكل صف (على الرغم من أن هذا هو التطبيق على شبكة الإنترنت, ليس سطح المكتب 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
بالنسبة خانات.
- حدد بعض بنية البيانات لتخزين محتويات الصفوف.وهذا يمكن أن تكون بسيطة جدا (الداخلية الكبيرة القائمة) ، أو معقدة مثل قاعدة بيانات SQL (في هذه الحالة نرى
للسماح متعددة مجموعة من الصفوف والأعمدة والخلايا.للقيام بذلك تحتاج إلى فهم اختيار النماذج.النسخة القصيرة:
- تعيين اختيار الوضعية ، على عرض الجدول:
view.setSelectionMode( QAbstractItemView.ContiguousSelection
).هذا سوف تمكنك من تسليط الضوء على خلايا متجاورة.يمكنك تسليط الضوء التعسفي الخلايا:انظرQAbstractView.SelectionMode
. - لتحديد الخلايا التي هي في الواقع اختيارها بعد إجراء نسأل عرض الجدول بالنسبة لها اختيار نموذج (ملاحظة 'l'):
view.selectionModel().selectedIndexes()
.يمكنك من خلال تكرار هذهfor
حلقة.
للسماح النقر بزر الماوس الأيمن:
- تجاوز المنظر
contextMenuEvent
. - إنشاء
QMenu
وتوصيله إلى أي فتحات تحتاج إليها.
من أجل فهم أكثر عمقا قراءة Qt دليل نموذج/عرض إذا كنت لم تقم بذلك بالفعل.و بالتأكيد أن نلقي نظرة على Qt البند أمثلة.العديد من تلك التي تصف يتم تنفيذها في PyQt في أقل من ذلك بكثير رمز (بما في ذلك اثنين @جيسي يذكر) ، نموذج شجرة أمثلة تحمل أكثر من الجداول ولكن مع أقل بكثير من العمل (تحتاج إلى تنفيذ أقل من ذلك بكثير ، كما هو موضح أعلاه.)
نصائح أخرى
هل يمكن أن يكون أيضا نظرة على QStandardItemModel، والتي تعطيك واجهة للتفاعل مع العناصر من خلال دولة "قابلة للتحديد"!
ويمكنك أيضا أن ترث من QAbstractItemModel واستخدام دور كيو تي :: CheckStateRole ...
في كيو تي / C ++ يمكنك إنشاء مندوب لبنود مخصصة في عمود. أفترض أنك تستطيع أن تفعل شيئا من هذا القبيل جدا في باي كيوت. راجع الأمثلة التالية: