Python pyqt是否支持具有两个值的堆叠进度条?
类似于,但适用于pyqt。我有一个应用程序,它有两个线程,一个线程处理一些数据(耗时),另一个线程显示结果并要求对结果进行验证。我想在进度条中显示已处理对象的数量。但是,我还想显示用户验证的对象数。处理的数量将始终等于或大于已验证对象的数量(因为您无法验证未验证的对象)。本质上,它有点像youtube视频或其他东西的加载条,显示“加载”的灰色部分和“观看”的红色部分。这是pyqt中可以支持的吗?的文档似乎没有暗示有任何支持。使用PyQt5和Python 3.6 它应该类似于这样: 这是一个最小可行的代码,它有两个单独的进度条,一个用于处理对象的数量,另一个用于验证的数量,但我希望它们重叠Python pyqt是否支持具有两个值的堆叠进度条?,python,user-interface,pyqt,pyqt5,Python,User Interface,Pyqt,Pyqt5,类似于,但适用于pyqt。我有一个应用程序,它有两个线程,一个线程处理一些数据(耗时),另一个线程显示结果并要求对结果进行验证。我想在进度条中显示已处理对象的数量。但是,我还想显示用户验证的对象数。处理的数量将始终等于或大于已验证对象的数量(因为您无法验证未验证的对象)。本质上,它有点像youtube视频或其他东西的加载条,显示“加载”的灰色部分和“观看”的红色部分。这是pyqt中可以支持的吗?的文档似乎没有暗示有任何支持。使用PyQt5和Python 3.6 它应该类似于这样: 这是一个最小可
import sys
from PyQt5.QtWidgets import (QApplication, QDialog,
QProgressBar, QPushButton)
class Actions(QDialog):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Progress Bar')
self.objectsToProcess = 100
self.objectsProcessed = 0
self.objectsVerified = 0
self.processProgress = QProgressBar(self)
self.processProgress.setGeometry(5, 5, 300, 25)
self.processProgress.setMaximum(self.objectsToProcess)
self.verifyProgress = QProgressBar(self)
self.verifyProgress.setGeometry(5, 35, 300, 25)
self.verifyProgress.setMaximum(self.objectsToProcess)
self.processButton = QPushButton('Process', self)
self.processButton.move(5, 75)
self.verifyButton = QPushButton('Verify', self)
self.verifyButton.move(90, 75)
self.show()
self.processButton.clicked.connect(self.process)
self.verifyButton.clicked.connect(self.verify)
def process(self):
if self.objectsProcessed + 1 < self.objectsToProcess:
self.objectsProcessed += 1
self.processProgress.setValue(self.objectsProcessed)
def verify(self):
if self.objectsVerified < self.objectsProcessed:
self.objectsVerified += 1
self.verifyProgress.setValue(self.objectsVerified)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Actions()
sys.exit(app.exec_())
导入系统
从PyQt5.QtWidgets导入(QApplication、QDialog、,
QpressBar、QPushButton)
集体诉讼(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def initUI(self):
self.setWindowTitle(“进度条”)
self.objectsToProcess=100
self.objectsProcessed=0
self.objectsVerified=0
self.processProgress=QProgressBar(self)
self.processProgress.setGeometry(5,5300,25)
self.processProgress.setMaximum(self.objectsToProcess)
self.verifyProgress=QProgressBar(self)
自我验证进度设置几何(5,35,300,25)
self.verifyProgress.setMaximum(self.objectsToProcess)
self.processButton=QPushButton('Process',self)
self.processButton.move(5,75)
self.verifyButton=QPushButton('Verify',self)
自我验证按钮移动(90,75)
self.show()
self.processButton.clicked.connect(self.process)
self.verifyButton.clicked.connect(self.verify)
def过程(自我):
如果self.objectsProcessed+1一个可能的解决方案是在QProgressBar中创建一个新属性,该属性显示可选的高级,要进行绘制,我们可以使用QProxyStyle:
from PyQt5 import QtCore, QtGui, QtWidgets
class ProxyStyle(QtWidgets.QProxyStyle):
def drawControl(self, element, option, painter, widget):
if element == QtWidgets.QStyle.CE_ProgressBar:
super(ProxyStyle, self).drawControl(element, option, painter, widget)
if hasattr(option, 'alternative'):
alternative = option.alternative
last_value = option.progress
last_pal = option.palette
last_rect = option.rect
option.progress = alternative
pal = QtGui.QPalette()
# alternative color
pal.setColor(QtGui.QPalette.Highlight, QtCore.Qt.red)
option.palette = pal
option.rect = self.subElementRect(QtWidgets.QStyle.SE_ProgressBarContents, option, widget)
self.proxy().drawControl(QtWidgets.QStyle.CE_ProgressBarContents, option, painter, widget)
option.progress = last_value
option.palette = last_pal
option.rect = last_rect
return
super(ProxyStyle, self).drawControl(element, option, painter, widget)
class ProgressBar(QtWidgets.QProgressBar):
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
opt = QtWidgets.QStyleOptionProgressBar()
if hasattr(self, 'alternative'):
opt.alternative = self.alternative()
self.initStyleOption(opt)
painter.drawControl(QtWidgets.QStyle.CE_ProgressBar, opt)
@QtCore.pyqtSlot(int)
def setAlternative(self, value):
self._alternative = value
self.update()
def alternative(self):
if not hasattr(self, '_alternative'):
self._alternative = 0
return self._alternative
class Actions(QtWidgets.QDialog):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Progress Bar')
self.objectsToProcess = 100
self.objectsProcessed = 0
self.objectsVerified = 0
self.progress_bar = ProgressBar(maximum=self.objectsToProcess)
self.process_btn = QtWidgets.QPushButton('Process')
self.verify_btn = QtWidgets.QPushButton('Verify')
self.process_btn.clicked.connect(self.process)
self.verify_btn.clicked.connect(self.verify)
lay = QtWidgets.QGridLayout(self)
lay.addWidget(self.progress_bar, 0, 0, 1, 2)
lay.addWidget(self.process_btn, 1, 0)
lay.addWidget(self.verify_btn, 1, 1)
def process(self):
if self.objectsProcessed + 1 < self.objectsToProcess:
self.objectsProcessed += 1
self.progress_bar.setValue(self.objectsProcessed)
def verify(self):
if self.objectsVerified < self.objectsProcessed:
self.objectsVerified += 1
self.progress_bar.setAlternative(self.objectsVerified)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyle(ProxyStyle(app.style()))
w = Actions()
w.show()
sys.exit(app.exec_())
从PyQt5导入QtCore、QtGui、qtwidget
类ProxyStyle(QtWidgets.QProxyStyle):
def drawControl(自身、元素、选项、画师、小部件):
如果元素==qtwidts.QStyle.CE\u ProgressBar:
超级(ProxyStyle,self).drawControl(元素、选项、画师、小部件)
如果hasattr(选项“备选方案”):
备选方案
最后一个值=option.progress
last_pal=option.palete
last_rect=option.rect
option.progress=备选方案
pal=QtGui.qpalete()
#另类颜色
pal.setColor(QtGui.qpalete.Highlight,QtCore.Qt.red)
option.palete=pal
option.rect=self.subElementRect(qtwidts.QStyle.SE_ProgressBarContents,option,widget)
self.proxy()
option.progress=最后一个值
option.palete=last\u pal
option.rect=最后一个
返回
超级(ProxyStyle,self).drawControl(元素、选项、画师、小部件)
类ProgressBar(qtwidts.QProgressBar):
def paintEvent(自身,事件):
painter=qtwidts.QStylePainter(self)
opt=qtwidts.QStyleOptionProgressBar()
如果hasattr(self,“alternative”):
opt.alternative=self.alternative()
self.initStyleOption(opt)
painter.drawControl(qtwidts.QStyle.CE_ProgressBar,opt)
@QtCore.pyqtSlot(int)
def setAlternative(自身,值):
自我选择=价值
self.update()
def备选方案(自我):
如果不是hasattr(自我,“\u备选方案”):
自选方案=0
返回自我
类操作(qtwidts.QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def initUI(self):
self.setWindowTitle(“进度条”)
self.objectsToProcess=100
self.objectsProcessed=0
self.objectsVerified=0
self.progress\u bar=ProgressBar(最大值=self.objectsToProcess)
self.process\u btn=qtwidts.QPushButton('process')
self.verify\u btn=QtWidgets.QPushButton('verify')
self.process\u btn.clicked.connect(self.process)
self.verify\u btn.单击.connect(self.verify)
lay=qtwidts.QGridLayout(self)
lay.addWidget(self.progress_栏,0,0,1,2)
lay.addWidget(self.process_btn,1,0)
lay.addWidget(self.verify_btn,1,1)
def过程(自我):
如果self.objectsProcessed+1
谢谢@eyll
# Opaque prog bar
self.verifyProgress = QProgressBar(self)
self.verifyProgress.setGeometry(5, 5, 300, 25)
self.verifyProgress.setMaximum(self.objectsToProcess)
self.verifyProgress.setFormat('%p% / ')
self.verifyProgress.setAlignment(Qt.AlignCenter)
# Must set the transparent prog bar second to overlay on top of opaque prog bar
self.processProgress = QProgressBar(self)
self.processProgress.setGeometry(5, 5, 300, 25)
self.processProgress.setMaximum(self.objectsToProcess)
self.processProgress.setFormat(' %p%')
self.processProgress.setAlignment(Qt.AlignCenter)
op = QGraphicsOpacityEffect(self.processProgress)
op.setOpacity(0.5)
self.processProgress.setGraphicsEffect(op)
def set_pb_value(self, pb, value_1, value_2):
if value_2 > value_1:
pb.setValue(value_2)
pb.setFormat("{} / {}".format(value_1, value_2))
pb.setStyleSheet('QProgressBar::chunk {' +
'background-color: qlineargradient(spread:pad, x1:' + str(value_1/pb.maximum()) + ', y1:0, x2:' +
str(value_1/value_2) + ', y2:0, stop:' + str(value_1/value_2) + ' rgba(0, 255, 0, 255), stop:1 '
'rgba(255, 0, 0, 255)); width: -1px; margin: -1px;}')
else:
pb.setValue(value_1)
pb.setFormat("%v")