TODO على متجر تطبيقات MAC ، باستخدام بنية PYQT5 ModelView لإنشاء تطبيق TODO بسيط

<h1>الواجهة الشبيهة ببنية ModelView QT S S MVC لعرض البيانات في طرق العرض</h1>
<blockquote>يظهر تطبيق التشغيل أدناه.</blockquote>
<h2>تودو 4+</h2>
<p><blockquote>لعدة سنوات استخدمت هذا التطبيق على جهاز iPad الخاص بي وجهاز iPhone و MacBookPro الخاص بي. إذا استمرت في العمل بشكل مثالي على iOS ، فيبدو أنه لم يتبع تطور MacOS تمامًا تمامًا.<br />لا توجد مشاكل في تثبيته. لكن لم يعد من الممكن التزامن مع Toodledo على MacOS ، في حين أنه لا يزال ممكنًا على iOS: لم يتم التعرف على المعرفات نفسها.<br />وبالتالي ، يصبح الأمر غير ضروري بالنسبة لي … ولا يبدو أن مساعدة Appigo في عجلة من أمرك لتقديم إجابة لطلبي. من غير السار دائمًا ملاحظة أن مفهوم العميل يفقد أكثر قليلاً من قيمته كل يوم.</blockquote></p>
<h3>بيزا د</h3>
<p><blockquote>منذ هذا التحديث ، فقدت جميع قوائمي في عدد 12 والتي أعمل بها يوميًا بطريقة مهنية. أدير ما يقرب من 200 موقع بشكل دائم ، وقد وضع هذا التحديث على الأرض أشهر من المحنة ! وجدت جميع المهام المنظمة في القائمة نفسها مجمعة في قائمة عالمية واحدة. من المؤكد أنه ليس هذا الخطأ الذي سيجعلني أنقل إلى الإصدار الذي يقوله هذا البرنامج على خلاف ذلك. لن أكون أسير. يبقى لي فقط أن أنتظر استجابة الدعم التي تم الاتصال بها هذا المساء عبر البريد الإلكتروني أو العثور على الإصدار القديم من هذا البرنامج الرائع. آمل حقًا أن يكون ذلك بمثابة شباب من الإصدار الجديد وليس استراتيجية لإجبارها على الانتقال إلى الإصدار المدفوع للمحترفين للعثور على وظائف تم الحصول عليها بالفعل مع الإصدار السابق. للحصول على معلومات ، يتم مزامني مع Dropbox</blockquote></p>
Surlepoint ، 12/13/2011
<h3>Synchro الآن النيكل</h3>
<p><blockquote>أمسكت قبل المزامنة التي كانت بطيئة ، مشيت بشكل سيء ، إلخ. ولكن الآن مع iCloud ، فإنه يناسبني تمامًا.</p></blockquote>
<p>بعض التحسينات الممكنة: المزيد من إعدادات العرض. <br />- لعرض ما يستخدمه المستخدم فقط. على سبيل المثال ، لا أستخدم السياقات أو الملصقات (على أي حال ليس بعد) وأود لم أعد أعرض هذه الخيارات التي “تلوث” بلدي. أرغب في الحصول على “التاريخ / الأولوية / القائمة / النوع فقط” للملاحظات اليومية والنقر بزر الماوس الأيمن للخيارات التي نادراً ما أستخدمها <br />- وعلى العكس من ذلك ، أرغب في عرض PLSU بسيط من القائمة المنسدلة لاختيار التاريخ والأولوية والقائمة ، … إذا كان لدي ثلاث قوائم فقط ، فستكون ثلاثة أزرار كافية لعرضها ، ويمكنني اختيار قائمتي بنقرة واحدة بدلاً من النقر على قائمة المنسدلة ، والعثور على الاسم ، وانقر فوقه. (DITTO للأولوية ، خاصة أننا نذهب من رسم مرئي للغاية على قائمة TODO إلى اختيار الاسم في الخيارات التي ليست طبيعية للغاية.</p>
<p>هذه تفاصيل بيئة العمل. يعجبني البساطة وكفاءة TODO ، لذلك أود أن تكون أكثر قابلية للتكوين لتكون أكثر بساطة.</blockquote> </p>
<h2>تطبيق الخصوصية</h2>
<p>لم يقدم المطور ، Appigo ، تفاصيل حول ممارساته الخاصة ومعالجة البيانات إلى Apple. لمزيد من المعلومات ، راجع سياسة الخصوصية في التطوير.</p>
<h2>الهندسة المعمارية النموذجية<br /> <small>واجهة تشبه MVC الخاصة بـ QT لعرض البيانات في طرق العرض</small> </h2>
<p>عندما تبدأ في إنشاء تطبيقات أكثر تعقيدًا مع PYQT5 ، من المحتمل أن تصادفها مع الاستغناء عن المصادقة مع بياناتك. البيانات المخزنة في الحاجيات (هـ.ز. لا تتوفر QListWidget البسيطة) بسهولة للتلاعب من Python – التغييرات تتطلب منك الحصول على عنصر ، والحصول على البيانات ، ثم أعدها مرة أخرى. الحل الافتراضي لهذا هو الحفاظ على تمثيل بيانات خارجي في Python ، ثم تحديثات تكرار لكل من البيانات والعناصر واجهة المستخدم ، أو ببساطة إعادة كتابة عنصر واجهة Wihole من البيانات. يمكن أن يصبح هذا قبيحًا بسرعة ، ويؤدي إلى الكثير من الغلاية فقط لتلاعب البيانات.</p>
<p>لحسن الحظ ، لدى QT حل لهذا – ModelViews. تعد ModelViews بديلاً قويًا لمقذاب العرض القياسية ، والتي تستخدم واجهة نموذجية منتظمة للتفاعل مع مصادر البيانات – من هياكل البيانات البسيطة إلى قواعد البيانات الخارجية. هذا يعزل بياناتك ، مما يتيح أن يتم الاحتفاظ بها في أي هيكل تريده ، في حين أن العرض يعتني بالعرض والتحديثات.</p>
<p>يقدم هذا البرنامج التعليمي الجوانب الرئيسية للهندسة المعمارية لـ QT من طراز QT ويستخدمه لإنشاء تطبيق TODO على سطح المكتب البسيط في PYQT5.</p>
<h2>تحكم عرض نموذج</h2>
<p><strong>النموذج – انظر – وحدة التحكم</strong> (MVC) هو استخدام نمط معماري لواجهات مستخدم التطوير التي تقسم التطبيق إلى ثلاثة أجزاء مترابطة. هذا يفصل التمثيل الداخلي للبيانات عن كيفية تقديم المعلومات إلى المستخدم وقبوله.</p>
<p>تصميم MVC Pattenn Fets ثلاثة مكونات رئيسية -</p>
<ul>
<li><strong>نموذج</strong> يحمل بنية البيانات التي يعمل بها التطبيق.</li>
<li><strong>منظر</strong> هل أي تمثيل للمعلومات كما هو موضح للمستخدم ، حيث الرسوم البيانية أو الجدول. يُسمح بعروض متعددة لنموذج البيانات نفسه.</li>
<li><strong>يتحكم</strong> يقبل المدخلات من المستخدم ، وتحويله إلى أوامر إلى النموذج أو العرض.</li>
</ul>
<p>إنه QT هبوط التمييز بين العرض والوحدة يحصل على القليل من الغموض. تقبل QT أحداث الإدخال من المستخدم (عبر نظام التشغيل) ويفوضها إلى الحاجيات (وحدة التحكم) للتعامل معها. ومع ذلك ، تتعامل أجهزة التشغيل أيضًا. بدلاً من أن يتألم حول مكان رسم الخط ، في QT-S-speak ، يتم تنظيم طريقة العرض والتحكم المدمجة على طراز “عرض نموذج” من أجل البساطة من أجل البساطة.</p>
<p>الأهم من ذلك ، التمييز بين <em>بيانات</em> و <em>كيف يتم تقديمه</em> هو الحفاظ.</p>
<h2>عرض النموذج</h2>
<p>يعمل النموذج كواجهة بين متجر البيانات و ViewController. يحتفظ النموذج بالبيانات (أو مرجعًا إليها) ويعرض هذه البيانات من خلال واجهة برمجة تطبيقات موحدة تتناولها ثم تستهلكها وتقدمها للمستخدم. يمكن أن تشارك طرق العرض المتعددة نفس البيانات ، وتقدمها بطرق مختلفة تمامًا.</p>
<p>يمكنك استخدام أي “مخزن بيانات” لنموذجك ، أو على سبيل المثال قائمة Python القياسية أو القاموس ، أو قاعدة بيانات (عبر E.ز. Sqlalchemy) – الأمر متروك لك.</p>
<p>الجزءان مسؤولان بشكل أساسي عن -</p>
<ol>
<li>شاي <strong>نموذج</strong> يخزن البيانات ، أو إشارة إليها وإرجاع فرد أو نطاقات من السجلات ، والبيانات الوصفية المرتبطة بها أو <em>عرض</em> تعليمات.</li>
<li>شاي <strong>منظر</strong> يطلب البيانات من النموذج ويعرض ما يتم إرجاعه على القطعة.</li>
</ol>
<p>هناك مناقشة متعمقة للهندسة المعمارية QT في الوثائق.</p>
الدليل الكامل لتطبيقات تعبئة Python Gui مع Pyinstaller.
<p><img src=”https://www.pythonguis.com/static/theme/images/products/packaging-book.png” alt=”تطبيقات Python التعبئة والتغليف مع Pyinstaller” /></p>
<p>[[تخفيض.خصم _PC]]] ٪ خصم على التالي [الخصم.المدة]] [خصم.الوصف]] مع الرمز [الخصم.رمز الكوبون]]</p>
<h4>شراء السلطة التكافؤ</h4>
<p>الحصول على المطورين في [[البلد]].Discount_PC]]]] قبالة على جميع الكتب والدورات مع رمز [خصم.رمز الكوبون]]</p>
<h2>عرض نموذج بسيط – قائمة TODO</h2>
<p>لتوضيح كيفية استخدام ModelViews في الممارسة. سيتكون هذا من QListView لقائمة العناصر ، و qlineedit لإدخال عناصر جديدة ، ومجموعة من الأزرار لإضافة أو حذف أو علامة على كما فعلت.</p>
<h3>واجهة المستخدم</h3>
<p>كان واجهة المستخدم البسيطة هي خالق QT القبيح وحفظها كـ Mainwindow.واجهة المستخدم . شاي .ملف واجهة المستخدم وجميع الأجزاء الأخرى يمكن تنزيلها أدناه.</p>
<p><img src=”https://ik.imagekit.io/mfitzp/pythonguis/static/tutorials/model-views/modelview-architecture/qt-creator.png?tr=w-100″ alt=”تصميم تطبيق TODO بسيط في QT Creator” width=”1654″ height=”962″ /></p>
<p> <em>تصميم تطبيق TODO بسيط في QT Creator</em></p>
<p>يظهر تطبيق التشغيل أدناه.</p>
<p><img src=”https://ik.imagekit.io/mfitzp/pythonguis/static/tutorials/model-views/modelview-architecture/mainwindow.png?tr=w-100″ alt=”تشغيل واجهة المستخدم الرسومية (لا شيء يعمل بعد)” width=”774″ height=”896″ /></p>
<p> <em>تشغيل واجهة المستخدم الرسومية (لا شيء يعمل بعد)</em></p>
<p>الحاجيات المتوفرة في الواجهة التي قدمناها المعرفات الموضحة في الجدول أدناه.</p>
<p> <table > <tr><th>objeuch</th> <th>عطوف</th> <th>وصف</th> </tr> </th> <tbody> <tr> <td>تودفيو</td> <td>QlistView</td> <td>قائمة تودوس الحالية</td> </tr> <tr> <td>Tododit</td> <td>QlineEdit</td> <td>إدخال النص لإنشاء عنصر TODO جديد</td> </tr> <tr> <td>addbutton</td> <td>qpushbutton</td> <td>قم بإنشاء TODO الجديد ، وإضافته إلى قائمة Todos</td> </tr> <tr> <td>DeleteButton</td> <td>qpushbutton</td> <td>احذف TODO المحدد الحالي ، وإزالته من قائمة Todos</td> </tr> <tr> <td>CompleteButton</td> <td>qpushbutton</td> <td>ضع علامة على TODO المحدد الحالي كما فعلت</td> </tr> </tbody> </table> </p>
<p>سنستخدم هذه المعرفات لتوصيل منطق التطبيق لاحقًا.</p>
<h3>الموديل</h3>
<p>نحدد نموذجنا المخصص من خلال التصنيف الفرعي من التنفيذ ، مما يسمح لنا بالتركيز على الأجزاء الفريدة لنموذجنا. QT يثبت عدد من قواعد النماذج المختلفة ، بما في ذلك القوائم والأشجار والجداول (مثالية لجداول البيانات).</p>
<p>بالنسبة لهذا المثال ، نعرض النتيجة إلى QListView . نموذج الأساس المطابق لهذا هو QabstractListModel . يظهر تعريف الخطوط التفصيلية لنموذجنا أدناه.</p>
<pre><code >الطبقة toDomodel (QTCore.QabstractListModel): def __init __ (self ، *args ، todos = none ، ** kwargs): super (toDomodel ، self).__init __ (*args ، ** kwargs).TODOS = TODOS أو [] DEF DATA (الذات ، الفهرس ، الدور): إذا كان الدور == QT.عرض العرض: # انظر أدناه للحصول على بنية البيانات. الحالة ، النص = الذات.تودوس [فهرس.الصف ()] # إرجاع نص TODO فقط. إرجاع نص إرجاع def rowcount (الذات ، الفهرس): إرجاع Len (Self.تودوس)</code> </pre>
<p>شاي .متغير TODOS هو متجر البيانات الخاص بنا والطريقتين ROWCOUNT () و DATA () هما طرق نموذج قياسية يجب علينا لنموذج القائمة. سنذهب من خلال هذه بدوره أدناه.</p>
<h4>.قائمة Todos</h4>
<p>متجر البيانات لنموذجنا .Todos ، قائمة Python البسيطة التي سنقوم بتخزينها من القيم في التنسيق [(Bool ، Str) ، (Bool ، Str) ، (Bool ، Str)] حيث يكون Bool هو <em>لذلك</em> حالة إدخال معين ، و Str هو نص todo.</p>
<p>نهيئة الذات.TODO إلى قائمة فارغة عند بدء التشغيل ، ما لم يتم تمرير القائمة عبر وسيطة TODOS الرئيسية.</p>
<p>الذات.Todos = Todos أو [] سوف يضعون الذات.TODOS لقيمة TODOS المقدمة إذا كانت كذلك <em>محموم</em> (أنا.ه. أي شيء آخر غير القائمة الفارغة ، أو الخاطئة المنطقية أو لا يوجد قيمة افتراضية) ، وإلا سيتم تعيينها على القائمة الفارغة [] .</p>
<p>لإنشاء ضمان لهذا النموذج ، يمكننا بسيطة -</p>
<pre><code >النموذج = TODODODEL () # قم بإنشاء قائمة TODO فارغة</code> </pre>
<p>أو لتمرير قائمة موجودة -</p>
<pre><code >TODOS = [(خطأ ، “عنصر”) ، (خطأ ، “عنصر آخر”)]</code> </pre>
<h4>.rowcount ()</h4>
<p>شاي .طريقة RowCount () هي Callade بواسطة العرض للحصول على عدد الصفوف في البيانات الحالية. هذا مطلوب للعرض الآن إلى أقصى فهرس ، يمكنه إعادة تخزين البيانات (ROW COUNT-1). البيع نستخدم قائمة Python كمتجر البيانات الخاص بنا ، وهي قيمة الإرجاع لهذا ببساطة Len () من القائمة.</p>
<h4>.بيانات ()</h4>
<p>هذا هو جوهر النموذج الخاص بك ، الذي يتعامل مع طلبات البيانات من العرض وإرجاع النتيجة المناسبة. يتلقى فهرس ودور معلمتين.</p>
<p>الفهرس هو الموضع/إحداثيات البيانات التي يطلبها العرض ، ويمكن الوصول إليها بطريقتين .الصف () و .العمود () الذي يعطي الموضع في كل بعد.</p>
<p>بالنسبة إلى QListView ، يكون العمود دائمًا 0 ويمكن تجاهله ، ولكن ستحتاج إلى استخدام هذا للبيانات ثنائية الأبعاد في عرض جدول البيانات.</p>
<p>الدور هو علم يشير إلى <em>عطوف</em> من البيانات التي تطلبها العرض. هذا لأن ال .تتحمل طريقة البيانات () في الواقع مسؤولية أكثر من مجرد البيانات الأساسية. كما أنه يتعامل مع طلبات الحصول على معلومات النمط ، وتلميحات الأدوات ، وأشرطة الحالة ، إلخ. – أي شيء يمكن إبلاغه بالبيانات نفسها.</p>
<p>تسمية QT.عرض العرض غريب بعض الشيء ، ولكن هذا يشير إلى أن <em>منظر</em> يسألنا “من فضلك أعطني بيانات للعرض”. هناك المزيد <em>أدوار</em> التي يمكن أن تتلقها البيانات لطلبات التصميم أو طلب البيانات بتنسيق “جاهز”.</p>
<p> <table > <tr><th>دور</th> <th>قيمة</th> <th>وصف</th> </tr> </th> <tbody> <tr> <td>كيو تي.عرض</td> <td>0</td> <td>البيانات الرئيسية التي يجب تقليصها في شكل نص. (QString)</td> </tr> <tr> <td>كيو تي.DecorationRole</td> <td>1</td> <td>البيانات المراد تقديمها كزخرفة في شكل أيقونة. (QCOLOR ، QICON أو QPIXMAP)</td> </tr> <tr> <td>كيو تي.افتتاحية</td> <td>2</td> <td>البيانات في متابعة رسمية للتحرير في محرر. (QString)</td> </tr> <tr> <td>كيو تي.Tooltiprole</td> <td>3</td> <td>البيانات المعروضة في تلميح أداة العنصر. (QString)</td> </tr> <tr> <td>كيو تي.الأساسي</td> <td>4</td> <td>البيانات المعروضة في شريط الحالة. (QString)</td> </tr> <tr> <td>كيو تي.Whatsisrole</td> <td>5</td> <td>البيانات المعروضة للعنصر في “ما هذا?” موضة. (QString)</td> </tr> <tr> <td>كيو تي.SizeHintrole</td> <td>13</td> <td>تلميح الحجم للعنصر الذي سيتم توفيره لوجهات النظر. (QSize)</td> </tr> </tbody> </table> </p>
<p>للحصول على قائمة كاملة من المتاحة <em>أدوار</em> يمكنك الحصول على وثيقة QT itmdatarole. ستستخدم قائمة TODO الخاصة بنا فقط QT.DisplayRole و Qt.DecorationRole .</p>
<h3>التنفيذ الأساسي</h3>
<p>فيما يلي تطبيق الكعب الأساسي اللازم لتحميل واجهة المستخدم وعرضه. سنضيف رمز النموذج الخاص بنا ومنطق التطبيق إلى هذه القاعدة.</p>
<pre><code >استيراد SYS من PYQT5 استيراد QTCORE ، QTGUI ، QTWidgets ، UIC من PYQT5.qtcore import qt_creator_file = “mainwindow.ui “ui_mainwindow ، qtbaseClass = UIC.loaduduype (qt_creator_file) class todomodel (qtcore.QabstractListModel): def __init __ (self ، *args ، todos = none ، ** kwargs): super (toDomodel ، self).__init __ (*args ، ** kwargs).TODOS = TODOS أو [] DEF DATA (الذات ، الفهرس ، الدور): إذا كان الدور == QT.عرض العرض: الحالة ، النص = ذاتي.تودوس [فهرس.ROW ()] إرجاع نص RETID DEF ROWCOUNT (SELF ، INDEX): Return Len (Self.Todos) فئة mainwindow (QTWidgets.QMainwindow ، UI_Mainwindow): def __init __ (الذات): QTWidgets.Qomainwindow.__init __ (الذات) ui_mainwindow.__init __ (الذات) الذات.setupui (الذات) الذات.النموذج = toDomodel () الذات.تودفيو.setModel (الذات.النموذج) التطبيق = QTWidgets.qapplication (sys.Argv) نافذة = نافذة mainwindow ().تطبيق عرض ().exec_ ()</code> </pre>
<p>نحن نحدد toDomodel كما كان من قبل ، وتهيئة كائن mainwindow. في __init__ بالنسبة إلى mainwindow ، نقوم بإنشاء مثيل لنموذج tod . احفظ هذا الملف كـ TODO.PY وقم بتشغيله مع -</p>
<pre><code >بيثون 3 تودو.خطوة</code> </pre>
<p>على الرغم من أنه لا يوجد الكثير مما يمكن رؤيته حتى الآن ، إلا أن QListView ونموذجنا يعملان بالفعل – إذا قمت بإضافة بعض البيانات الافتراضية ، فستراها تظهر في القائمة.</p>
<pre><code >الذات.نموذج = toDomodel (TODOS = [(خطأ ، “أول تودو”))))))))))</code> </pre>
<p><img src=”https://ik.imagekit.io/mfitzp/pythonguis/static/tutorials/model-views/modelview-architecture/my-first-todo.png?tr=w-100″ alt=”QListView يعرض عنصر tod” width=”387″ height=”448″ /></p>
<p> <em>QListView يعرض عنصر tod</em></p>
<p>يمكنك الاستمرار في إضافة عناصر مثل هذا يدويًا وستظهر في حالة ترتيبها في QListView . بعد ذلك سنجعل من الممكن إضافة ITMs من داخل التطبيق.</p>
<p>قم أولاً بإنشاء طريقة جديدة على Mainwindow المسمى ADD . هذا هو رد الاتصال الخاص بنا والذي سيهتم بإضافة النص الحالي من الإدخال باعتباره todo جديد. قم بتوصيل هذه الطريقة بـ Addbutton.إشارة مضغوطة في نهاية كتلة __init__.</p>
<pre><code >Class Mainwindow (QTWidgets.QMainwindow ، UI_Mainwindow): def __init __ (الذات): QTWidgets.Qomainwindow.__init __ (الذات) ui_mainwindow.__init __ (الذات) الذات.setupui (الذات) الذات.النموذج = toDomodel () الذات.تودفيو.setModel (الذات.النموذج) # قم بتوصيل الزر. الذات.addbutton.يضعط.الاتصال (الذات.إضافة) DEF ADD (Self): “” إضافة عنصر إلى قائمة Tode الخاصة بنا ، والحصول على النص من QlineEdit .Todedit وهناك تطهيرها. “” “النص = ذاتي.Tododit.نص () إذا كان النص: # لا تضيف سلاسل فارغة. # الوصول إلى القائمة عبر النموذج. الذات.نموذج.تودوس.إلحاق ((خطأ ، نص)) # تحديث الزناد. الذات.نموذج.LayoutChanged.تنبعث منها () # تفريغ المدخلات الذاتية.Tododit.نص مجموعة (“”)</code> </pre>
<p>في إضافة كتلة إشعار الخط.نموذج.LayoutChanged.ينبعث () . هنا ننبعث من إشارة نموذج .layoutchanged لإعلام الرأي بأن <em>شكل</em> تم تغيير البيانات. هذا يؤدي إلى تحديث كيان العرض. إذا حذفت هذا السطر ، فسيظل إضافة toDo ولكن لن يتم تحديث QListView.</p>
<p>إذا تم تغيير البيانات فقط ، ولكن لا يتأثر عدد الصفوف/الأعمدة .إشارة datachanged () بدلا من ذلك. يحدد هذا أيضًا منطقة تم تغييرها في البيانات باستخدام استئجار من أعلى اليسار واليمين السفلي لتجنب إعادة رسم عرض العرض بأكمله.</p>
<h3>ربط الإجراءات الأخرى</h3>
<p>يمكننا الآن توصيل بقية إشارات الزر وإضافة مساعدة للأداء <em>يمسح</em> و <em>مكتمل</em> عمليات. نضيف إشارات الزر إلى كتلة __init__ كما كان من قبل.</p>
<pre> <code >الذات.addbutton.يضعط.الاتصال (الذات.إضافة) الذات.DeleteButton.يضعط.الاتصال (الذات.حذف) الذات.CompleteButton.يضعط.الاتصال (الذات.مكتمل)</code> </pre>
<p>ثم حدد طريقة حذف جديدة على النحو التالي -</p>
<pre> <code >DEF DELETE (الذات): الفهارس = الذات.تودفيو.SelectedDindexes () إذا فهرسة: # فهارس هي قائمة بعنصر واحد في واحد. الفهرس = الفهرسة [0] # قم بإزالة العنصر والتحديث. ديل الذات.نموذج.تودوس [فهرس.صف ()] الذات.نموذج.LayoutChanged.emit () # قم بمسح التحديد (لأنه ليس صالحًا طويلًا). الذات.تودفيو.Clarselection ()</code> </pre>
<p>نستخدم الذات.تودفيو.SelectedDIndexes للحصول على الفهارس (في الواقع قائمة بعنصر واحد ، كما نحن في وضع الاختيار الفردي) ثم .الصف () كفهرس في قائمة تودوس لدينا على نموذجنا. نقوم بحذف العنصر المفهرس باستخدام مشغل Python’s DEL ، ثم نؤدي إلى إشارة إلى وضعية تم تعديلها بسبب تعديل شكل البيانات.</p>
<p>بصناديق ، نقوم بمسح التحديد النشط لأن العنصر الذي يرتبط به الآن خارج الحدود (إذا كنت قد حددت العنصر الأخير).</p>
<p>يمكنك محاولة جعل هذا المجر الذكي ، وتحديد العنصر الأخير في القائمة بدلاً من ذلك</p>
<p>الطريقة الكاملة تحب مثل هذا -</p>
<pre> <code >Def Complete (Self): Indexes = Self.تودفيو.SelectRedIndExes () إذا فهرسة: الفهرس = الفهرسة [0] الصف = الفهرس.row () الحالة ، النص = ذاتي.نموذج.Todos [Row] Self.نموذج.TODOS [ROW] = (TRUE ، TEXT) # .يأخذ datachanged أعلى اليسرى واليمين ، والتي هي متساوية # للاختيار واحد. الذات.نموذج.datachanged.EMIT (الفهرس ، الفهرس) # قم بمسح التحديد (لأنه ليس صالحًا طويلًا). الذات.تودفيو.Clarselection ()</code> </pre>
<p>هذا يستخدم نفس الفهرسة كما هو الحال مع الحذف ، ولكن هذه المرة نأتي العنصر من النموذج .قائمة Todos ثم استبدل الحالة بـ TRUE .</p>
<p>يتعين علينا القيام بهذا الجلب والاستبدال ، حيث يتم تخزين بياناتنا كبيثون التي لا يمكن تعديلها.</p>
<p>المفتاح مختلف هنا مقابل. تتمثل أجهزة توجيهي QT القياسية في أننا نجري تغييرًا مباشرةً في بياناتنا ، ونحتاج إلى إخطار QT بأنه يغير haasurd – يتم التعامل مع تحديث حالة العناصر المستخدم تلقائيًا.</p>
<h3>باستخدام QT.DecorationRole</h3>
<p>إذا قمت بتشغيل التطبيق الآن ، فيجب أن تجد أن إضافة وحذف كلا العمل ، ولكن أثناء إكمال العناصر ، لا يوجد أي مؤشر على ذلك في العرض. نحتاج إلى تحديث نموذجنا لتزويد العرض بمؤشر لعرضه عند اكتمال عنصر ما. يظهر النموذج المحدث أدناه.</p>
<pre><code >علامة = qtgui.Qimage (‘علامة.png ‘) class toDomodel (qtcore.QabstractListModel): def __init __ (self ، *args ، todos = none ، ** kwargs): super (toDomodel ، self).__init __ (*args ، ** kwargs).TODOS = TODOS أو [] DEF DATA (الذات ، الفهرس ، الدور): إذا كان الدور == QT.عرض العرض: _ ، نص = ذاتي.تودوس [فهرس.ROW ()] إرجاع النص إذا كان الدور == QT.DecorationRole: الحالة ، _ = الذات.تودوس [فهرس.ROW ()] إذا كانت الحالة: إرجاع علامة DEF ROWCOUNT (الذات ، الفهرس): إرجاع LEN (Self.تودوس)</code> </pre>
<p>كانوا يستخدمون علامة رمز علامة.PNG للإشارة إلى العناصر الكاملة ، والتي نقوم بتحميلها في كائن Qimage المسمى TICK . في النموذج ، قمنا بتنظيف معالج لـ QT.DecorationRole الذي يعيد أيقونة العلامة للصفوف التي هي الحالة صحيحة (من أجل اكتمال).</p>
<p>الأيقونة التي أستخدمها مأخوذة من Fugue التي حددها P.Yusukekamiyamane</p>
<p>intostad من أيقونة I يمكنك أيضًا العودة إلى اللون ، هـ.ز. qtgui.QColor (‘الأخضر’) الذي سيتم رسمه كمربع صلب.</p>
<p>تشغيل التطبيق يجب أن تكون قادرًا الآن على تحديد العناصر على أنها كاملة.</p>
<p><img src=”https://ik.imagekit.io/mfitzp/pythonguis/static/tutorials/model-views/modelview-architecture/todos_complete.png?tr=w-100″ alt=”تدوس وضع علامة كاملة” width=”387″ height=”448″ /></p>
<p> <em>تدوس وضع علامة كاملة</em></p>
<h2>متجر بيانات مستمر</h2>
<p>يعمل تطبيق TODO الخاص بنا بشكل جيد ، لكن يحتوي على عيب واحد قاتلة-إنه ينسى تودوك بمجرد أن تغلق التطبيق مع التفكير في أنه ليس لديك ما تفعله عندما تفعل قد تساهم في مشاعر Zen على المدى القصير ، على الأرجح ، إنه على الأرجح أ فكرة سيئة.</p>
<p>الحل هو تنفيذ بعض نزهة متجر البيانات. أبسط النهج هو متجر ملفات بسيط ، حيث نقوم بتحميل العناصر من ملف JSON أو Pickle عند بدء التشغيل ، واكتب التغيير مرة أخرى.</p>
<p>للقيام بذلك ، نحدد طريقتين جديدتين على يدنا . هذه البيانات تحميل من بيانات اسم ملف JSON.JSON (إذا كان موجودًا ، يتجاهل الخطأ إذا لم يكن كذلك).نموذج.تودوس واكتب الذات الحالية.نموذج.تودوس إلى نفس الملف ، على التوالي.</p>
<pre> <code >Def Load (Self): Try: with Open (‘Data.json ‘،’ r ‘) كـ f: self.نموذج.تودوس = JSON.تحميل (و) استثناء الاستثناء: تمرير DEF SAVE (Self): مع فتح (‘البيانات.json ‘،’ w ‘) كـ f: data = json.تفريغ (الذات.نموذج.تودوس ، و)</code> </pre>
<p>لاستمرار التغييرات في البيانات التي نحتاجها لإضافة .حفظ () معالج إلى نهاية أي طريقة تعدل البيانات ، و .تحميل () معالج إلى كتلة __init__ بعد إنشاء النموذج.</p>
<p>الرمز النهائي يشبه هذا -</p>
<pre><code >استيراد SYS استيراد JSON من PYQT5 استيراد QTCORE ، QTGUI ، QTWIDGETS ، UIC من PYQT5.qtcore import qt_creator_file = “mainwindow.ui “ui_mainwindow ، qtbaseClass = UIC.loaduduseype (qt_creator_file) tick = qtgui.Qimage (‘علامة.png ‘) class toDomodel (qtcore.QabstractListModel): def __init __ (self ، *args ، todos = none ، ** kwargs): super (toDomodel ، self).__init __ (*args ، ** kwargs).TODOS = TODOS أو [] DEF DATA (الذات ، الفهرس ، الدور): إذا كان الدور == QT.عرض العرض: _ ، نص = ذاتي.تودوس [فهرس.ROW ()] إرجاع النص إذا كان الدور == QT.DecorationRole: الحالة ، _ = الذات.تودوس [فهرس.ROW ()] إذا كانت الحالة: إرجاع علامة DEF ROWCOUNT (الذات ، الفهرس): إرجاع LEN (Self.Todos) فئة mainwindow (QTWidgets.Qmainwindow ، UI_Mainwindow): def __init __ (self): Super (Mainwindow ، Self).__في ذاته.setupui (الذات) الذات.النموذج = toDomodel () الذات.تحميل () الذات.تودفيو.setModel (الذات.نموذج) الذات.addbutton.يضعط.الاتصال (الذات.إضافة) الذات.DeleteButton.يضعط.الاتصال (الذات.حذف) الذات.CompleteButton.يضعط.الاتصال (الذات.أكمل) DEF ADD (Self): “” “إضافة عنصر إلى قائمة Tode الخاصة بنا ، والحصول على النص من QlineEdit .Todedit وهناك تطهيرها. “” “النص = ذاتي.Tododit.نص () إذا كان النص: # لا تضيف سلاسل فارغة. # الوصول إلى القائمة عبر النموذج. الذات.نموذج.تودوس.إلحاق ((خطأ ، نص)) # تحديث الزناد. الذات.نموذج.LayoutChanged.تنبعث منها () # تفريغ المدخلات الذاتية.Tododit.setText (“”) الذات.Save () Def Delete (Self): Indexes = Self.تودفيو.SelectedDindexes () إذا فهرسة: # فهارس هي قائمة بعنصر واحد في واحد. الفهرس = الفهرسة [0] # قم بإزالة العنصر والتحديث. ديل الذات.نموذج.تودوس [فهرس.صف ()] الذات.نموذج.LayoutChanged.emit () # قم بمسح التحديد (لأنه ليس صالحًا طويلًا). الذات.تودفيو.Clarselection () الذات.Save () Def Complete (Self): Indexes = Self.تودفيو.SelectRedIndExes () إذا فهرسة: الفهرس = الفهرسة [0] الصف = الفهرس.row () الحالة ، النص = ذاتي.نموذج.Todos [Row] Self.نموذج.TODOS [ROW] = (TRUE ، TEXT) # .يأخذ datachanged أعلى اليسرى واليمين ، والتي هي متساوية # للاختيار واحد. الذات.نموذج.datachanged.EMIT (الفهرس ، الفهرس) # قم بمسح التحديد (لأنه ليس صالحًا طويلًا). الذات.تودفيو.Clarselection () الذات.حفظ () def load (Self): Try: with Open (‘Data.db ‘،’ r ‘) كـ f: self.نموذج.تودوس = JSON.تحميل (و) استثناء الاستثناء: تمرير DEF SAVE (Self): مع فتح (‘البيانات.DB ‘،’ W ‘) كـ f: data = json.تفريغ (الذات.نموذج.Todos ، F) App = qtwidgets.qapplication (sys.Argv) نافذة = نافذة mainwindow ().تطبيق عرض ().exec_ ()</code> </pre>
<p>إذا كانت البيانات الموجودة في التطبيق الخاص بك لديها القدرة على الحصول على كبيرة أو أكثر تعقيدًا ، فيمكنك prefe لاستخدام قاعدة بيانات فعلية لتخزينها. في هذه الحالة ، سيقوم النموذج بلف الواجهة إلى قاعدة البيانات والاستعلام عنها مباشرة لعرض البيانات. غطاء L’ll كيفية القيام بذلك في برنامج تعليمي قادم.</p>
<p>للحصول على مثال آخر مثير للاهتمام على QListView ، راجع تطبيق مشغل الوسائط هذا. يستخدم Qt Building QMediaplayList كخزائن بيانات ، مع عرض المحتويات إلى QListView .</p>
<h2>حول BCR.CX:</h2>
<p>BCR.CX هي شركة ناشئة للتكنولوجيا البرازيلية ، متخصصة في كل من عمليات الاستعانة بمصادر خارجية للأعمال (BPO) والاستعانة بمصادر خارجية لبيئة الأعمال (BEO) ، والتي تركز بشكل أساسي على توليد الطلب ، تجربة العملاء ، التواصل ، دعم المستخدم والرضا.</p>
<h2>وصف:</h2>
<p>تم تطوير تطبيق TODO كوسيلة سريعة وآمنة وسهلة الاستخدام لتخزين ملاحظات الوكيل خلال أيام العمل.</p>
<p>تكون قادرًا على إنشاء وإدارة مهامك الخاصة ، بناءً على كل تذكرة فردية أو عميل.</p>
<p>قم بإنشاء مسارات وتخصيص سير العمل الخاص بك</p>
<p>الإنتاجية تعزز! باستخدام تطبيق TODO ، يمكنك إنشاء مهام سير عمل مخصصة لتوحيد العمليات المتكررة. حاول الآن وابدأ في السيطرة على تقدمك ، حيث أن Todos و Dones.</p>
<h2>موارد:</h2>
<ol>
<li>إنشاء مهام لكل تذكرة</li>
<li>شريط التقدم لمتابعة التسليم</li>
<li>إنشاء مهام عمل موحدة لتعزيز الإنتاجية.</li>
<li>إدارة قائمة المهام الخاصة بك ، من أجل الحفاظ عليها مع روتينك اليومي.</li>
</ol>
<ol>
<li>مكدس كل من TODO و Zendesk Sunshine للوصول الكامل إلى ميزات التطبيق</li>
<li>تحسين الإنتاجية عن طريق إنشاء أو تحرير الأتمتة المهام ، وحفظ الإعدادات المسبقة الخاصة بك.</li>
</ol>