Python:QtGui.QProgressBar 颜色
Posted
技术标签:
【中文标题】Python:QtGui.QProgressBar 颜色【英文标题】:Python: QtGui.QProgressBar Color 【发布时间】:2014-03-11 17:25:36 【问题描述】:我想知道是否有办法自定义进度条的颜色(QtGui.QProgressBar)。假设我们希望在 bar 达到 100% 时将其设为绿色。
这是一个工作示例:
import sys, time
from PyQt4 import QtCore, QtGui
class PbWidget(QtGui.QProgressBar):
def __init__(self, parent=None, total=20):
super(PbWidget, self).__init__()
self.setMinimum(1)
self.setMaximum(total)
self._active = False
def update_bar(self, to_add_number):
while True:
time.sleep(0.01)
value = self.value() + to_add_number
self.setValue(value)
QtGui.qApp.processEvents()
if (not self._active or value >= self.maximum()):
break
self._active = False
def closeEvent(self, event):
self._active = False
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.main_layout = QtGui.QVBoxLayout()
self.pb=PbWidget(total=101)
self.main_layout.addWidget(self.pb)
ok_button = QtGui.QPushButton("Press to update Progress Bar")
ok_button.clicked.connect(self.OK)
self.main_layout.addWidget(ok_button)
central_widget = QtGui.QWidget()
central_widget.setLayout(self.main_layout)
self.setCentralWidget(central_widget)
def OK(self):
self.pb.update_bar(10)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.resize(480, 320)
window.show()
sys.exit(app.exec_())
【问题讨论】:
WE缺少import sys
感谢您的指出。关于热更改 p.bar 颜色的任何建议?
【参考方案1】:
是的,为此使用CSS
。是的CSS
你读得很好! ;)
将此函数添加到您的 PbWidget
类中:
def change_color(self, color):
template_css = """QProgressBar::chunk background: %s; """
css = template_css % color
self.setStyleSheet(css)
颜色参数需要类似:“yellow”、“blue”、“red”...以及 HEX 表示法:“#FFD45”等...
您可以在update_bar
中调用此函数,并根据进度条值向它传递一些颜色。例如:
def update_bar(self, to_add_number):
while True:
time.sleep(0.5)
value = self.value() + to_add_number
self.setValue(value)
if value > 50:
self.change_color("yellow")
QtGui.qApp.processEvents()
if (value >= self.maximum()):
break
self._active = False
要更改其他视觉属性,请访问:Qt StyleSheet Reference 并查找 QtProgressBar
。祝你好运!!!
【讨论】:
感谢您的信息! Qt 中的 CSS 支持非常酷。这很有趣。它很容易成为一个花费大量时间的地方:使用所有这些 CSS 设置。再次感谢! 如果我的帖子是你要找的答案,请标记。或者至少给我一票。谢谢。【参考方案2】:这里是迄今为止所讨论内容的摘要。
似乎控制 Qt 小部件的最简单和最灵活的方法是使用 CSS(这在 Web 开发人员中是众所周知的)。 CSS 语法几乎是不言自明且易于理解(但不记得)。在 Python/Pyqt 中实现 CSS 更加容易。在 .py 脚本中定义 CSS“样式”。或者将其作为单独的 myStyle.css 文件存储在磁盘上 - 您必须使用 open(path.'r') 读取它并始终保留它。
下面是一个示例,说明如何使用 CSS 来控制一些小部件的外观(对话框、按钮和进度条)(根据 RM 的建议,当 p.bar 达到 51% 时会变为红色)。
import time
from PyQt4 import QtCore, QtGui
styleData="""
QWidget
color: #b1b1b1;
background-color: #323232;
QProgressBar
border: 2px solid grey;
border-radius: 5px;
text-align: center;
QProgressBar::chunk
background-color: #d7801a;
width: 2.15px;
margin: 0.5px;
QPushButton:pressed
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525);
QComboBox:hover,QPushButton:hover
border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);
QPushButton
color: #b1b1b1;
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);
border-width: 1px;
border-color: #1e1e1e;
border-style: solid;
border-radius: 6;
padding: 3px;
font-size: 12px;
padding-left: 5px;
padding-right: 5px;
"""
class PbWidget(QtGui.QProgressBar):
def __init__(self, parent=None, total=20):
super(PbWidget, self).__init__()
self.setMinimum(1)
self.setMaximum(total)
self._active = False
def update_bar(self, to_add_number):
while True:
time.sleep(0.01)
value = self.value() + to_add_number
self.setValue(value)
if value > 50:
self.change_color("green")
QtGui.qApp.processEvents()
if (not self._active or value >= self.maximum()):
break
self._active = False
def closeEvent(self, event):
self._active = False
def change_color(self, color):
template_css = """QProgressBar::chunk background: %s; """
css = template_css % color
self.setStyleSheet(css)
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.main_layout = QtGui.QVBoxLayout()
self.pb=PbWidget(total=101)
self.main_layout.addWidget(self.pb)
ok_button = QtGui.QPushButton("Press to update Progress Bar")
ok_button.clicked.connect(self.OK)
self.main_layout.addWidget(ok_button)
central_widget = QtGui.QWidget()
central_widget.setLayout(self.main_layout)
self.setCentralWidget(central_widget)
def OK(self):
self.pb.update_bar(10)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.resize(480, 320)
window.setStyleSheet(styleData)
window.show()
sys.exit(app.exec_())
【讨论】:
我使用QProgressBar background: green
来更改进度条的背景颜色,但是除非我还添加border-radius: 1px;
,否则这不起作用。关于为什么会这样的任何建议?以上是关于Python:QtGui.QProgressBar 颜色的主要内容,如果未能解决你的问题,请参考以下文章