باستخدام PyQt وQt4، هل هذه هي الطريقة الصحيحة للحصول على مصدر نبض في علامة تبويب QTabWidget؟

StackOverflow https://stackoverflow.com/questions/3301866

  •  26-09-2020
  •  | 
  •  

سؤال

لدي بعض التعليمات البرمجية لإنشاء QTabWidget من Python باستخدام PyQt4.أريد الحصول على صورة GIF متحركة "ضارب" في علامة التبويب./الطريقة الوحيدة/ التي وجدت بها كيفية القيام بذلك هي الطريقة المعقدة التالية.

tabBar = self.tabReports.tabBar()
lbl = QtGui.QLabel(self.tabReports)
movie = QtGui.QMovie(os.path.join(self.basedir, "images\\throbber.gif"))
lbl.setMovie(movie)
QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), lambda i: movie.jumpToFrame(i))
movie.start()
log.debug("valid = %s"%(movie.isValid()))
tabBar.setTabButton(idxtab, QtGui.QTabBar.LeftSide, lbl)

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

والأكثر إزعاجًا، إذا قمت ببساطة بإسقاط لامدا (أي جعل السطر يقول QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame) لا يعرض حتى الإطار الأول أبدًا.

إذا ما الخطأ الذي أفعله؟

ملاحظة:أدرك أن .tabBar() هو عضو محمي، لكنني افترضت (بشكل صحيح على ما يبدو) أن PyQt يزيل حماية الأعضاء المحميين :).أنا جديد على Qt، وأفضل عدم استخدام فئة فرعية من QTabWidget إذا كان بإمكاني مساعدتها.

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

المحلول

أعتقد أن مشكلة الكود الذي نشرته في البداية هي أن QMovie لم يكن له أصل، وبالتالي سمح تحديد النطاق بتدمير مشكلة C++ الأساسية.من الممكن أيضًا أن أواجه مشكلات في الترابط - Threading.thread وQThread لا يعملان معًا بشكل جيد.رمز العمل الموجود لدي الآن موجود أدناه - لا حاجة للعبث بالإشارات ولا بالفتحات.

def animateTab(self, tab_widget, enable):
    tw = tab_widget
    tabBar = tw.tabBar()
    if enable:
        lbl = QtGui.QLabel(tw)
        movie = QtGui.QMovie("images\\throbber.gif"), parent=lbl)
        movie.setScaledSize(QtCore.QSize(16, 16))
        lbl.setMovie(movie)
        movie.start()
    else:
        lbl = QtGui.QLabel(tw)
        lbl.setMinimumSize(QtCore.QSize(16, 16))
    tabBar.setTabButton(tab_section.index, QtGui.QTabBar.LeftSide, lbl)

نصائح أخرى

لقد واجهت نفس المشكلة وساعدني هذا النشر في حل المشكلة:http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

بالنسبة لي يبدو أن هذا يحدث فرقًا:QMovie("image.gif"، QByteArray()، self)

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