2014-11-05 59 views
1

我有一個圖像序列呈現出來。我想在一個簡單的QMainWindow或QDialog中進行回報。這是我的目標。它將圖像加載到qlabel中,但我無法看到正在更新的標籤,它只顯示上次加載的圖像,而沒有任何介於兩者之間的圖像。 也許有人知道什麼?使用Qt播放圖像序列QMainWindow

from PySide import QtCore, QtGui 
import shiboken 
import maya.OpenMayaUI as apiUI 
import time 

def getMayaWindow(): 
    """ 
    Get the main Maya window as a QtGui.QMainWindow instance 
    @return: QtGui.QMainWindow instance of the top level Maya windows 
    """ 
    ptr = apiUI.MQtUtil.mainWindow() 
    if ptr is not None: 
     return shiboken.wrapInstance(long(ptr), QtGui.QWidget) 


class Viewer(QtGui.QMainWindow): 

def __init__(self, parent = getMayaWindow()): 
    super(Viewer, self).__init__(parent) 
    self.setGeometry(400, 600, 400, 300) 
    self.setUi() 

def setUi(self): 
    self.label = QtGui.QLabel() 
    self.setCentralWidget(self.label) 

def showUi(self): 
    self.show() 

def loadImage(self, path): 
    self.label.clear() 
    image = QtGui.QImage(path) 
    pp = QtGui.QPixmap.fromImage(image) 
    self.label.setPixmap(pp.scaled(
      self.label.size(), 
      QtCore.Qt.KeepAspectRatio, 
      QtCore.Qt.SmoothTransformation)) 

x = Viewer() 
x.showUi() 
for i in range(1, 11):  
    x.loadImage("C://anim%03d.png" % i) 
    time.sleep(0.5) 
+0

不熟悉python,但我的C++眼睛告訴我,你在循環中改變pixmaps,並睡眠所有的GUI線程。這是不正確的。嘗試使用QTimer用於此目的,信號超時,創建插槽並更改此插槽中的像素映射。如果我不對,或者這對你有幫助,指出我。 – Chernobyl 2014-11-05 20:49:32

+0

它阻止了GUI。我只是嘗試qLabel.repaint(),現在播放該序列。但仍然阻止了GUI。 我會嘗試QTimer,看看它是否仍然阻止UI – arvidurs 2014-11-05 20:59:18

+0

沒有QTimer不會阻止GUI,我發佈這個答案,因爲它是一個解決方案,我也添加了解釋爲什麼它不會阻止GUI線程。 – Chernobyl 2014-11-05 21:03:33

回答

0

您更改循環和睡眠(停止)所有GUI線程像素圖,這就是爲什麼你GUI凍結。

http://www.tutorialspoint.com/python/time_sleep.htm

這是不正確的。 qLabel.repaint()這是不好的解決方案,因爲它仍然阻止GUI。當然,你可以使用processEvents,但它也是不好的方法。

您應該使用QTimer爲此目的,使用timeout()信號,創建插槽並更改此插槽中的pixmaps。在這種情況下,您的GUI將不會被阻止,因爲QTimer異步工作,圖像將成功更改。

相同的代碼與環和sleep可以幫助你,只有當這個代碼將在另一個線程(線程多)執行,但因爲有特殊的類QTimer沒有必要。