سؤال

أحتاج إلى تخصيص عملية الرسم ل qgraphicsview، لذلك أتجاوز طريقة Drawitems مثل هذا:

self.graphicsview.drawItems=self.drawer.drawItems

أين self.graphicsview هو qgraphicsview، و self.drawer هي فئة مخصصة مع طريقة drawItems.
في هذه الطريقة، أتحقق من بعض الأعلام لتحديد كيفية رسم كل عنصر، ثم اتصل item.paint, ، مثله:

def drawItems(self, painter, items, options):
    for item in items:
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, options, self.target)

self.target هو QGRAPHICSVIEVIVEN's QGRAPHISSSSCENE.
ومع ذلك، بمجرد وصوله item.paint, ، ينهار من الحلقة - دون أي أخطاء. إذا وضعت الشرطية حول اللوحة، ولكل نوع ممكن من QGRAPHISSITEM لصق التعليمات البرمجية المفترض أن يتم تنفيذها (من خلال النظر في مصادر جيت كيو تي)، كل شيء يعمل.
ليس حلا لطيفا جدا على الرغم من ... وأنا لا أفهم كيف يمكن حتى أن تندلع من الحلقة؟

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

المحلول

هناك استثناء يحدث عند رسم العناصر، ولكن لم يتم الإبلاغ عنها على الفور. على نظامي (Pyqt 4.5.1، Python 2.6)، لا يتم الإبلاغ عن استثناء عند قرد التصحيح الطريقة التالية:

def drawItems(painter, items, options):
    print len(items)
    for idx, i in enumerate(items):
        print idx, i
        if idx > 5:
            raise ValueError()

انتاج:

45
0 <PyQt4.QtGui.QGraphicsPathItem object at 0x3585270>
1 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ca68>
2 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ce20>
3 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc88>
4 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc00>
5 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356caf0>
6 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cb78>

ومع ذلك، بمجرد إغلاق التطبيق، تتم طباعة الطريقة التالية:

Exception ValueError: ValueError() in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

حاولت الطباعة threading.currentThread(), ، لكنه يعيد نفس الخيط ما إذا كان يسمى في أو خارج القرد مصححة drawItems طريقة.

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

def drawItems(self, painter, items, options):
    for item, option in zip(items, options):
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, option, self.target)

أيضا، أنت تقول self.target هو كائن المشهد. ال وثائق ل paint() يقول:

هذه الوظيفة، والتي يتم استدعاؤها عادة بواسطة qgraphicsView، يرسم محتويات عنصر في الإحداثيات المحلية. ... الوسيطة القطعة اختيارية. إذا قدمت، فإنها تشير إلى القطعة التي يتم رسمها؛ خلاف ذلك، فهو 0. بالنسبة للوحة المخزنة مؤقتا، فإن القطعة هي دائما 0.

والنوع هو QWidget*. QGraphicsScene يرث من QObject وليس القطعة، لذلك من المحتمل أن يكون هذا خطأ أيضا.

ومع ذلك، فإن حقيقة عدم الإبلاغ عن الاستثناء على الإطلاق، أو لا تقترح على الفور بعض اللعب كريهة، يجب عليك الاتصال بالمواضع.

نصائح أخرى

السبب في أن الحلقة مختارة فجأة هي أن يتم طرح استثناء. Python لا يتعامل معه (لا يوجد try: Block)، لذلك يتم تمريره إلى المدعوين (رمز C ++ كيو تي) الذي ليس له فكرة عن استثناءات Python، لذلك فقدت.

أضف تجربة / ما عدا حول الحلقة ويجب أن ترى السبب وراء حدوث ذلك.

ملاحظة: منذ بيثون 2.4، يجب ألا تتجاوز الأساليب هذه الطريقة بعد الآن.

بدلا من ذلك، يجب أن تستمد فئة جديدة من qgraphicsView وإضافة drawItems() طريقة لهذا الفئة الجديدة. سيؤدي ذلك إلى استبدال الطريقة الأصلية بشكل صحيح.

لا تنسى الاتصال super() في ال __init__ طريقة! خلاف ذلك، لن يعمل كائنك بشكل صحيح.

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