Изменение стиля QProgressBar в таблице QTableView
Попытаюсь конкретизировать свой вопрос. У меня имеется база данных, которую я отображаю через QTableView. У меня появилась необходимость показать в этой таблице шкалу прогресса.
Я нашел код (ниже), который решил мою проблему и отображает шкалу прогресса. Отображается она синим цветом. Я хочу поменять стиль данной шкалы, допустим цвет поменять просто или же подгрузить свой стиль.
Не понимаю как это реализовать.
from PyQt5 import QtCore, QtGui, QtWidgets
data = [("1", "Baharak", 10), ("2", "Darwaz", 60),
("3", "Fays abad", 20), ("4", "Ishkashim", 80),
("5", "Jurm", 100)]
class ProgressDelegate(QtWidgets.QStyledItemDelegate):
def paint(self, painter, option, index):
progress = index.data(QtCore.Qt.UserRole+1000)
opt = QtWidgets.QStyleOptionProgressBar()
opt.rect = option.rect
opt.minimum = 0
opt.maximum = 100
opt.progress = progress
opt.text = "{}%".format(progress)
opt.textVisible = True
QtWidgets.QApplication.style().drawControl
(QtWidgets.QStyle.CE_ProgressBar, opt, painter)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QTableView()
delegate = ProgressDelegate(w)
w.setItemDelegateForColumn(2, delegate)
model = QtGui.QStandardItemModel(0, 3)
model.setHorizontalHeaderLabels(["ID", "Name", "Progress"])
for _id, _name, _progress in data:
it_id = QtGui.QStandardItem(_id)
it_name = QtGui.QStandardItem(_name)
it_progress = QtGui.QStandardItem()
it_progress.setData(_progress, QtCore.Qt.UserRole+1000)
model.appendRow([it_id, it_name, it_progress])
w.setModel(model)
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Если вы хотите продолжить тему приведенного вами примера, то читайте:
класс QStyleOptionProgressBar используется для описания параметров, необходимых для рисования индикатора выполнения.
Это полный список элементов QStyleOptionProgressBar, включая унаследованные элементы.
Пример Styles показывает, как создавать собственные стили рисования виджетов с помощью Qt, и демонстрирует предопределенные стили Qt.
Я вам покажу как задуманное вами делать с использование Qt Style Sheets.
from PyQt5 import QtCore, QtGui, QtWidgets
data = [
("1", "Baharak", 10),
("2", "Darwaz", 60),
("3", "Fays abad", 20),
("4", "Ishkashim", 80),
("5", "Jurm", 100)
]
class ProgressDelegate(QtWidgets.QStyledItemDelegate):
def paint(self, painter, option, index):
progress = index.data(QtCore.Qt.UserRole+1000)
opt = QtWidgets.QStyleOptionProgressBar()
opt.rect = option.rect
opt.minimum = 0
opt.maximum = 100
opt.progress = progress
opt.text = f"{progress}%"
opt.textVisible = True
QtWidgets.QApplication.style().drawControl(
QtWidgets.QStyle.CE_ProgressBar, opt, painter)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
app.setStyleSheet('''
QProgressBar {
background-color: #DA7B93;
color: rgb(200, 200, 200);
border-style: none;
border-radius: 4px;
text-align: center;
font-size: 30px;
}
QProgressBar::chunk {
border-radius: 10px;
background-color: qlineargradient(
spread:pad x1:0, x2:1, y1:0.511364, y2:0.523,
stop:0 #1C3334, stop:1 #376E6F);
}
''')
w = QtWidgets.QTableView()
w.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
titulos = w.horizontalHeader()
titulos.setSectionResizeMode(QtWidgets.QHeaderView.Interactive)
titulos.setStretchLastSection(True)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
delegate = ProgressDelegate(w)
w.setItemDelegateForColumn(2, delegate)
model = QtGui.QStandardItemModel(0, 4) # + 4
model.setHorizontalHeaderLabels([
"ID", "Name", "Progress",
"New Progress" # + "Progress"
])
for _id, _name, _progress in data:
it_id = QtGui.QStandardItem(_id)
it_name = QtGui.QStandardItem(_name)
it_progress = QtGui.QStandardItem()
it_progress.setData(_progress, QtCore.Qt.UserRole+1000)
model.appendRow([it_id, it_name, it_progress])
w.setModel(model)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
progressList = []
for i in range(0, len(data)):
progressList.append(QtWidgets.QProgressBar())
progressList[i].setValue(data[i][2])
w.setIndexWidget(model.index(i, 3), progressList[i])
w.resize(700, 200)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
w.show()
sys.exit(app.exec_())

