2014-11-05 1 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

파이썬에 익숙하지 않지만 내 C++ 눈은 회 돌이에서 pixmaps를 변경하고 모든 GUI 스레드를 잠자 게한다고 알려줍니다. 올바르지 않습니다. 이를 위해 QTimer를 사용하고, 타임 아웃 신호를 보내고, 슬롯을 생성하고,이 슬롯에서 픽스맵을 변경하십시오. 내가 옳지 않거나 이것이 당신을 도왔다면 나를 가르쳐주십시오. – Chernobyl

+0

GUI를 차단합니다. 방금 시퀀스를 재생하는 qLabel.repaint()를 시도했습니다. 그러나 여전히 GUI를 차단합니다. QTimer를 사용하여 여전히 UI를 차단하는지 확인합니다 – arvidurs

+0

아니요 QTimer가 GUI를 차단하지 않습니다. 솔루션이기 때문에 답변을 게시 했으므로 GUI 스레드를 차단하지 않는 이유에 대한 설명도 추가했습니다. – Chernobyl

답변

0

당신은 루프와 수면 (정지) 모든 GUI 스레드에서 픽스맵을 변경, 그 이유를 GUI 동결입니다.

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

이 올바르지 않습니다. qLabel.repaint() 여전히 블록 GUI을 차단하기 때문에 해결책이 아닙니다. 물론 processEvents을 사용할 수 있지만 나쁜 접근법이기도합니다.

이 목적으로 QTimer을 사용하고 신호를 사용하고이 슬롯에서 pixmaps를 변경하고 pixmap을 변경해야합니다. 이 경우 QTimer이 비동기 적으로 작동하고 이미지가 성공적으로 변경되므로 GUI이 차단되지 않습니다.

루프와 동일한 코드와 sleep은이 코드가 다른 스레드 (멀티 스레딩)에서 실행될 때만 도움이 될 수 있지만 특수 클래스 QTimer이 있으므로 필요하지 않습니다.