【问题标题】:Progress bar with pyqt带有 pyqt 的进度条
【发布时间】:2021-08-30 19:23:04
【问题描述】:

我有一个程序运行许多线程,其中一个控制界面,另一个每隔几秒钟启动一些功能。我希望计时线程更新进度条,但是当我这样做时,我得到:

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 和 pyqt 4.7.4

【问题讨论】:

  • 你做错了。您绝对应该为此使用信号和插槽。
  • 您确实应该使用信号和插槽。您能提供您尝试使用信号的代码吗?
  • QtCore.QObject.connect(self.progressBar, QtCore.SIGNAL("valueChanged(int)"), self.progressBar.setValue)
  • 请用信号/槽方法更新问题。但据我所知,你连接了错误对象的错误信号和插槽。
  • 现在更新了。我认为信号是正确的,因为它是参考指南中唯一可用于 progressBars 的信号。错误可能是在插槽选举中。

标签: python pyqt pyqt4 qt4


【解决方案1】:

你必须像这样为 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)

您所做的是将progressBar 的SIGNAL valueChanged 连接到它自己的SLOT setValue

【讨论】:

  • 我在调用“self.tick(x)”时收到“TypeError: native Qt signal is not callable”错误。
  • 糟糕,我直接在这里输入,没有测试。应该是self.tick.emit(x)
猜你喜欢
  • 2012-10-27
  • 2017-08-04
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多