سؤال

طيب حتى أنا عندي QGraphicsScene في فئة تسمى العين.أنا استدعاء دالة:

void eye::playSequence(int sequenceNum) {

    for (int i=0; i<sequences[sequenceNum].numberOfSlides(); i++) {
        presentSlide(sequenceNum, i);
        time_t start;
            time(&start);
            bool cont=false;
            while (!cont) {
                time_t now;
                time(&now);
                double dif;
                dif=difftime(now, start);
                if (dif>5.0)
                    cont=true;
            }
    }
}

والتي لكل شريحة المكالمات:

void eye::presentSlide(int sequenceNum, int slideNum) {

    Slide * slide=sequences[sequenceNum].getSlide(slideNum);

    QGraphicsPixmapItem * pic0=scene.addPixmap(slide->getStimulus(0)->getImage());
    pic0->setPos(0,0);

    QGraphicsPixmapItem * pic1=scene.addPixmap(slide->getStimulus(1)->getImage());
    pic1->setPos(horizontalResolution-350,0);

    QGraphicsPixmapItem * pic2=scene.addPixmap(slide->getStimulus(2)->getImage());
    pic2->setPos(horizontalResolution-350,verticalResolution-450);

    QGraphicsPixmapItem * pic3=scene.addPixmap(slide->getStimulus(3)->getImage());
    pic3->setPos(0,verticalResolution-450);
}

الآن أتوقع هذا إلى عرض مجموعة من الصور الانتظار لمدة 5 ثوان ، ثم عرض المقبل ، وهلم جرا.بدلا من ذلك فإنه يعرض شيئا حتى جميع الشرائح تم معالجتها ومن ثم الأربعة الأخيرة يتم عرض الصور.لقد حاولت الاتصال بك scene.update() في كل مكان يمكنني أن الصورة لم تفعل أي شيء.يبدو المشهد التحديثات فقط عندما playSequence ترجع الدالة.أي أفكار أو ما يمكن أن يحدث هنا ؟

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

المحلول

هذا هو نوع من السلوك الذي غالبا ما ينظر في الحدث مدفوعة واجهة المستخدم الرسومية أطر عندما يريد أحد القيام المستمر الرسوم المتحركة.أنا أعتقد أن العين::playSequence يسمى من النقر على زر أو ربما من بعض نقطة أثناء بدء تشغيل التطبيق رمز ؟ في أي حال, هنا هو ما يحدث.

Qt يستخدم التطبيق الرئيسية الخيط لدفع الحدث حلقة.الحدث حلقة شيئا من هذا القبيل:

while(app_running)
{
  if(EventPending)
    ProcessNextEvent();
}

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

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

إذا كنت تريد أكثر مباشرة وأقل أنيقة حل سريع ، حاول الإتصال qapp->processEvents() بعد الدعوة إلى presentSlide(sequenceNum أنا).هذا (أكثر من مرة) قوة تطبيق لمسح أي قائمة الانتظار الأحداث التي ينبغي أن تشمل الطلاء الأحداث.

أود أن أذكر أيضا أن العين::presentSlide() هو مجرد إضافة مشهد جديد من الكائنات إلى مكان الحادث على كل التكرار تغطي تلك التي تمت إضافتها خلال آخر مكالمة.أعتقد من المشهد باب الثلاجة و عند استدعاء المشهد().addXXX كنت رمي المزيد من مغناطيس الثلاجة على الباب :)

نصائح أخرى

تحتاج إلى ترك حلقة حدث التطبيق يعمل من أجل الحفاظ على تحديث واجهة المستخدم. أسهل طريقة للقيام بذلك من التعليمات البرمجية هي استدعاء Qapplication :: Processevents () في LOOP الداخلية أثناء الحلقة الداخلية.

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

يمكنك إنشاء كائن Qtimer في منشئ فئة عينيك، تعيين مهلة من 5 ثوان، وتوصيل إشارة مهلة لها إلى فتحة في فئة عينيك والتي تقوم بتحديث الفهرس في مجموعة الشرائح والمكالمات التي يقدمها (). ستبدأ الموقت في وظيفة Plactiment ().

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