PyQt5中的进度条控件默认只支持整数类型的进度值,无法直接显示小数点值。然而,在一些需求场景中,需要展示小数点进度值,为此我们需要针对进度条控件进行一些自定义设置,实现自定义进度条控件的效果。
以下是实现自定义进度条控件的过程:
- 导入所需模块
首先,需要导入PyQt5模块,以及QtGui、QtWidgets等相关模块。以下为示例代码:
from PyQt5 import QtGui, QtWidgets
- 创建自定义进度条控件类
接着,创建一个自定义进度条控件类,并从QProgressBar类继承,以便进行细致的自定义设置。以下为示例代码:
class DecimalProgressBar(QtWidgets.QProgressBar):
def __init__(self, parent=None):
super(DecimalProgressBar, self).__init__(parent)
在上述代码中,首先创建了一个名为DecimalProgressBar的自定义进度条控件类,并从QtWidgets.QProgressBar类继承了一些基本的控件特性。
- 定义小数点位数
在QProgressBar控件中,可以用setValue()方法来设置进度条进度值。而在自定义进度条控件中,我们需要进一步定义小数点位数。以下为示例代码:
class DecimalProgressBar(QtWidgets.QProgressBar):
def __init__(self, parent=None, decimals=1):
super(DecimalProgressBar, self).__init__(parent)
self._decimals = decimals
def setValue(self, value):
self.value = value
self.setFormat('%v.%d' % (value, self._decimals))
QtWidgets.QProgressBar.setValue(self, int(value * (10 ** self._decimals)))
在上述代码中,我们首先重载了setValue()方法,以便对setValue()方法进行自定义的处理。其中,value属性用于存储传入进度值的数据,setFormat()方法用于设置进度条数值的显示格式。
在该示例代码中,%v占位符表示实际值,而%d占位符表示小数点位数。使用setFormat()方法将小数点位数格式化后,再使用QtWidgets.QProgressBar.setValue()方法对进度值进行转换并赋值。
- 创建自定义进度条控件实例
最后,我们使用上述自定义进度条控件类创建实例,并在界面中显示出来。以下为示例代码:
class MainWidget(QtWidgets.QWidget):
def __init__(self):
super(MainWidget, self).__init__()
self.progressbar = DecimalProgressBar(self)
self.layout = QtWidgets.QHBoxLayout(self)
self.layout.addWidget(self.progressbar)
在该示例代码中,我们创建了一个名为MainWidget的主窗口界面,并在其中使用DecimalProgressBar类创建了一个进度条实例,并将其添加到水平布局中进行显示。这样就完成了自定义进度条控件的整个过程。
示例1:简单示例
以下是一个简单的示例,展示了如何使用自定义进度条控件在进度条中显示小数点值。我们首先创建了一个DecimalProgressBar类,并在其中设置小数点位数为1:
class DecimalProgressBar(QtWidgets.QProgressBar):
def __init__(self, parent=None, decimals=1):
super(DecimalProgressBar, self).__init__(parent)
self._decimals = decimals
def setValue(self, value):
self.value = value
self.setFormat('%v.%d' % (value, self._decimals))
QtWidgets.QProgressBar.setValue(self, int(value * (10 ** self._decimals)))
接着,我们创建了一个MainWidget窗口类,并在其中实例化了上述DecimalProgressBar控件,并添加到主窗口中:
class MainWidget(QtWidgets.QWidget):
def __init__(self):
super(MainWidget, self).__init__()
self.progressbar = DecimalProgressBar(self)
self.layout = QtWidgets.QHBoxLayout(self)
self.layout.addWidget(self.progressbar)
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_progressbar)
timer.start(50)
self._step = 0.001
def update_progressbar(self):
self.progressbar.setValue(self.progressbar.value + self._step)
在上述代码中,我们使用了一个定时器模拟进度变化,并通过setValue()方法实现了进度条控件的更新。
示例2:实际应用
以下是一个实际应用场景的示例,展示了如何使用自定义进度条控件展示进度下载的进度。我们首先创建了一个DownloadWindow类,并定义窗口中的一些控件:
class DownloadWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.progress = DecimalProgressBar(self)
self.statusbar = QtWidgets.QStatusBar()
self.statusbar.addWidget(self.progress)
self.setStatusBar(self.statusbar)
self.central_widget = QtWidgets.QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QtWidgets.QVBoxLayout()
self.central_widget.setLayout(self.layout)
self.button = QtWidgets.QPushButton("Download")
self.button.clicked.connect(self.download)
self.layout.addWidget(self.button)
接着,我们定义了download()方法,用于实现下载进度的更新:
def download(self):
self.button.setDisabled(True)
def _download():
for i in range(0, 100):
time.sleep(0.05)
QtWidgets.QApplication.processEvents()
self.progress.setValue((i + 1) / 100)
thread = threading.Thread(target=_download)
thread.start()
self.thread_waiter(thread)
def thread_waiter(self, thread):
if thread.is_alive():
thread.join()
self.button.setDisabled(False)
在该方法中,我们使用了一个线程模拟下载过程,并在下载过程中通过setValue()方法更新进度条控件的值。
最后,我们在主函数中创建了DownloadWindow类的实例,并显示出来:
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = DownloadWindow()
window.show()
sys.exit(app.exec_())
这样,就完成了在自定义进度条控件中显示小数点值的完整应用攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 如何在进度条中显示小数点值 - Python技术站