2012-03-13 33 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