2012-03-13 88 views
2

我有一個程序運行多個線程,其中一個控制界面,另一個啓動一些功能,每隔幾秒鐘。我想時機線程更新進度條買的時候我做的,我得到:pyqt進度條

X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 165 
    Extension: 150 (RENDER) 
    Minor opcode: 25 (RenderCompositeGlyphs32) 
    Resource id: 0x25 
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 165 
    Extension: 150 (RENDER) 
    Minor opcode: 25 (RenderCompositeGlyphs32) 
    Resource id: 0x25 
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 165 
    Extension: 150 (RENDER) 
    Minor opcode: 25 (RenderCompositeGlyphs32) 
    Resource id: 0x25 
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 165 
    Extension: 150 (RENDER) 
    Minor opcode: 25 (RenderCompositeGlyphs32) 
    Resource id: 0x25 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 

這裏是我的代碼:

#!/usr/bin/python 
from PyQt4 import QtCore, QtGui 
import time 

class WTrainning(wMeta.WMeta, QtGui.QWidget): 

    def __init__(self): 
     super(WTrainning, self).__init__() 

    def createUI(self): 

     ... 
     self.progressBar = QtGui.QProgressBar(self) 
     self.progressBar.setGeometry(QtCore.QRect(30, 70, 481, 23)) 
     self.progressBar.setProperty("value", 24) 
     self.progressBar.setObjectName("progressBar") 
     QtCore.QObject.connect(self.progressBar, QtCore.SIGNAL("valueChanged(int)"), self.progressBar.setValue) 
     ... 

    def modifyBarr(self, number): 
     self.progressBar.setValue(number) 

class Crono(QtCore.QThread): 

    def __init__(self, parent): 

     QtCore.QThread.__init__(self,parent) 


    def checkStatus(self): 

     for x in range(1,101): 
      self.wtobject.modifyBarr(x)       
      time.sleep(1) 

我會試着用信號(新舊版本)和爲UI更新創建專用線程,但沒有任何工作。我使用python 2.6.6和4.7.4的PyQt

+0

你就錯了。你一定要使用信號和插槽。 – Dikei 2012-03-13 10:45:55

+0

你的確應該使用信號和插槽。你能提供你用信號試過的代碼嗎? – 2012-03-13 10:50:56

+0

QtCore.QObject.connect(self.progressBar,QtCore.SIGNAL(「valueChanged(int)」),self.progressBar.setValue) – amusero 2012-03-13 10:58:50

回答

4

你必須定義爲CRONO對象這樣一個信號:

class Crono(QtCore.QThread): 
    tick = QtCore.pyqtSignal(int, name="changed") #New style signal 

    def __init__(self, parent): 
     QtCore.QThread.__init__(self,parent) 

    def checkStatus(self): 
     for x in range(1,101): 
      self.tick.emit(x)      
      time.sleep(1) 

然後將其連接到進度條的插槽。

class WTrainning(wMeta.WMeta, QtGui.QWidget): 

    def __init__(self): 
     super(WTrainning, self).__init__() 
     self.crono = Crono() 

    def createUI(self): 
     #Create GUI stuff here 

     #Connect signal of self.crono to a slot of self.progressBar 
     self.crono.tick.connect(self.progressBar.setValue) 

什麼你做的是進度的信號valueChanged連接到自己的SLOT setValue

+0

當我調用「self.tick(x)」時,出現「TypeError:native Qt signal is not callable」錯誤。 – amusero 2012-03-13 14:12:13

+0

調用「類型(self.tick)」顯示PyQt4.QtCore.pyqtBoundSignal – amusero 2012-03-13 14:26:30

+0

糟糕,我直接在這裏輸入而不進行測試。它應該是'self.tick.emit(x)' – Dikei 2012-03-13 14:37:43