如果添加多个窗口(pyside),进度条将无法正常工作

时间:2014-01-07 04:13:35

标签: python pyqt pyside

我有一个主窗口,当用户选择要上传的文件时,新窗口将打开文件的显示状态,即文件名,上传速度,剩余时间等(如IDM和xdman)

当用户添加文件以上传所有内容时

如果用户想要添加更多要上传的文件

,问题就出现了

第一个窗口将停止更新数据(应继续上传完成)

第二个窗口显示继续更新信息,但进度条将与第一个窗口混合(我的意思是两个进度条将同时显示在第二个窗口中!!!) 我该怎么把它们分开? 这是我的代码的简短版本,以了解我的所作所为!

class Window(QtGui.QWidget):
 def __init__(self, parent=None):
    super(Window, self).__init__(parent)
    self.table = QtGui.QTableWidget(self)#progressbar work perfectly in table but not in new windows !

 def handleAddUpload(self):
    #choosing a file codes go here

    progress = QtGui.QProgressBar(self.table)
    progress.setRange(0, len(data))
    #two above line will add progressbar to table !
    tabs = self.createTab() #caling createTab for creating new window for...

 def handleUploadProgress(self, key, sent, total):
 #handleeUploadProgress method call rapidly since data needs to be stream and update !


   progress = self.table.cellWidget(key, 0)
   progress.setValue(sent)
#two above line will update value in table without any problem

   self.procbar.setValue(sent) #this line call progressbar value from createTab()

 def createTab(self): #all my problems are in this method
    self.tab = QtGui.QTabWidget()
    layout = QtGui.QVBoxLayout(self)
    tab = QtGui.QWidget()
    layout1 = QtGui.QVBoxLayout(tab)
    self.procbar = QtGui.QProgressBar()
    self.procbar.setStyleSheet("")
    self.procbar.setRange(0, 0) #a range added in handleaddupload,for shorting this I didn't show that
    self.procbar.setValue(0)

    layout1.addWidget(self.procbar)
    self.tab.addTab(tab, 'Upload Status')
    layout.addWidget(self.tab)
    self.tab.show()

 def handleUploadFinished(self, key):
    #codes.....

我认为这是与进度条相关的所有内容

因为我是python / pyside的新手,所以我请求帮助here is the base of my code(我从这个答案开始)

以下是我的简短问题:如何添加单独的小工具以同时显示多个进度条?

感谢大家阅读这个无聊的问题

更新1 : 这是软件enter image description here

的图片

当我添加Pharrell歌曲上传表格中的进度条和单独的窗口显示时,但当我添加新歌上传(justin)时:

1- Pharrell单独窗口中的进度条停止工作(因为你可以看到百分比不一样)!

2个进度条(仅在单独的窗口中)为新添加的歌曲显示两个进度百分比(它迅速变为10%和26%)

(在所有情况下表中的进度条都有效)

1 个答案:

答案 0 :(得分:1)

就我所发布的代码而言,问题似乎是您没有正确管理状态窗口。

首先,我认为你应该创建一个类似这样的StatusTab类:

class StatusTab(QtGui.QTabWidget):
    def __init__(self, parent=None):
        QtGui.QTabWidget.__init__(self, parent)
        layout = QtGui.QVBoxLayout(self)
        tab = QtGui.QWidget(self)
        layout1 = QtGui.QVBoxLayout(tab)
        self.procbar = QtGui.QProgressBar(tab)
        self.procbar.setStyleSheet("")
        self.procbar.setRange(0, 0)
        self.procbar.setValue(0)
        layout1.addWidget(self.procbar)
        self.addTab(tab, 'Upload Status')
        layout.addWidget(tab)
        ...

(当然,这个类还有其他方法和属性来处理上传状态,信息等)。

接下来,您需要一个容器来容纳StatusTab的实例:

class Window(QtGui.QWidget):
    def __init__(self, address):
        QtGui.QWidget.__init__(self)
        ...
        self._uploaders = {}
        self._statustabs = {}

然后像这样创建它们:

    def handleAddUpload(self):
        ...
        statustab = StatusTab(self)
        self._statustabs[row] = statustab

像这样更新它们:

    def handleUploadProgress(self, key, sent, total):
        ...
        statusbar = self._statusbars[key]
        statusbar.procbar.setValue(sent)

最后,您应该在不再需要它们时将其删除:

    def handleUploadFinished(self, key):
        ...
        uploader = self._uploaders.pop(key)
        uploader.deleteLater()
        statustab = self._statustabs.pop(key)
        statustab.deleteLater()

显然,上面的代码是基于我的其他答案,但希望您能够根据自己的需要进行调整。