Изменение стиля QProgressBar в таблице QTableView

Рейтинг: 1Ответов: 1Опубликовано: 23.01.2023

введите сюда описание изображения

Попытаюсь конкретизировать свой вопрос. У меня имеется база данных, которую я отображаю через 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_())

Ответы

▲ 0Принят

Если вы хотите продолжить тему приведенного вами примера, то читайте:

  • класс 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_())

введите сюда описание изображения