2012-03-13 23 views
2

私はプログラムが多数のスレッドを実行しており、そのうちの1つはインターフェイスを制御し、もう1つは数秒ごとにいくつかの機能を起動します。ここでプログレスバーwith 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更新用の専用スレッドを作成しても、何も機能しませんでした。私は、あなたがこのようなクロノオブジェクトのための信号を定義する必要がパイソン2.6.6および4.7.4 PyQtは

+0

に独自のSLOTにプログレスバーのSIGNAL valueChangedを接続してあります。あなたは間違いなくこのために信号とスロットを使うべきです。 – Dikei

+0

本当に信号とスロットを使用する必要があります。シグナルで試したコードを提供できますか? –

+0

QtCore.QObject.connect(self.progressBar、QtCore.SIGNAL( "valueChanged(int)")、self.progressBar.setValue) – amusero

答えて

4

を使用しています:

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) 

は、あなたが間違ったことをやっているsetValue

+0

"self.tick(x)"を呼び出すと、 "TypeError:ネイティブQt信号が呼び出せません"というエラーが表示されます。 – amusero

+0

「type(self.tick)」を呼び出すと、PyQt4.QtCore.pyqtBoundSignalが表示されます。 – amusero

+0

私はテストをせずにここに直接入力します。それは 'self.tick.emit(x)'でなければなりません – Dikei