PyQt5 tableView показывает негативы красного цвета и (x.xx) - PullRequest
2 голосов
/ 23 октября 2019

Прежде всего, спасибо за попытку помочь мне. Я нашел в Интернете некоторый код, который очень близок к тому, что мне нужно, но я не смог сделать последний бит. Я хочу, чтобы любое число в csv (tableView), которое отрицательно отображалось красным цветом и форматировалось как (x.xx), а положительные числа были бы x.xx. В Интернете я нашел какой-то код об изменении фона ячейки, но я хочу изменить шрифт и пример, использующий абстрактную модель, нужно ли мне делать все это с абстрактным вместо стандартного? Если мне нужно сделать это абстрактно, не могли бы вы привести пример (я новичок во всем этом).

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import csv
import locale

from PyQt5 import QtCore, QtGui, QtWidgets


class MyWindow(QtWidgets.QWidget):
    def __init__(self, fileName, parent=None):
        super(MyWindow, self).__init__(parent)

        locale.setlocale(locale.LC_ALL, '')

        self.fileName = fileName

        self.model = QtGui.QStandardItemModel(self)

        self.tableView = QtWidgets.QTableView(self)
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)

        self.pushButtonLoad = QtWidgets.QPushButton(self)
        self.pushButtonLoad.setText("Load Csv File!")
        self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)

        self.pushButtonWrite = QtWidgets.QPushButton(self)
        self.pushButtonWrite.setText("Write Csv File!")
        self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)

        self.layoutVertical = QtWidgets.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.tableView)
        self.layoutVertical.addWidget(self.pushButtonLoad)
        self.layoutVertical.addWidget(self.pushButtonWrite)

    def loadCsv(self, fileName):
        with open(fileName, "r") as fileInput:
            # skip header
            next(fileInput)
            for row in csv.reader(fileInput):
                # convert to $x.xx and ($x.xx)
                row[-1] = float(row[-1])
                row[-1] = locale.currency(row[-1], grouping=True)

                items = [
                    QtGui.QStandardItem(field)
                    for field in row
                ]

                self.model.appendRow(items)

    def writeCsv(self, fileName):
        with open(fileName, "w", newline='') as fileOutput:
            writer = csv.writer(fileOutput)
            for rowNumber in range(self.model.rowCount()):
                fields = [
                    self.model.data(
                        self.model.index(rowNumber, columnNumber),
                        QtCore.Qt.DisplayRole
                    )
                    for columnNumber in range(self.model.columnCount())
                ]
                writer.writerow(fields)

    @QtCore.pyqtSlot()
    def on_pushButtonWrite_clicked(self):
        self.writeCsv(self.fileName)

    @QtCore.pyqtSlot()
    def on_pushButtonLoad_clicked(self):
        self.loadCsv(self.fileName)

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow("data.csv")
    main.show()

    sys.exit(app.exec_())

1 Ответ

1 голос
/ 23 октября 2019

Чтобы изменить формат отображения информации, есть несколько параметров:

  • Переопределить метод данных модели, чтобы он возвращал необходимое значение, связанное со стандартными ролями,например, в этом случае Qt :: DisplayRole и Qt :: ForegroundRole,

  • Используйте прокси, такой как QIdentityProxyModel, или, альтернативно, QSortFilterProxyModel, перезаписав метод данных как предыдущий метод, или

  • Создайте делегата для настройки рисования.

В этом случае я буду использовать последний метод, поскольку он более гибкий, так как если вы хотите показатьинформация о модели в нескольких представлениях может формироваться по-разному, а также о том, что вы можете изменять другие свойства, не определяемые моделью, а другими элементами, такими как стиль.

Учитывая вышеизложенное, решение:

class CustomDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(CustomDelegate, self).initStyleOption(option, index)
        try:
            value = float(option.text)
        except ValueError:
            return
        option.text = "{0:.2f}".format(value)
        brush = (
            option.palette.brush(QtGui.QPalette.Text)
            if value >= 0
            else QtGui.QBrush(QtGui.QColor("red"))
        )
        option.palette.setBrush(QtGui.QPalette.Text, brush)
self.tableView = QtWidgets.QTableView(self)
# ...
delegate = CustomDelegate(self.tableView)
self.tableView.setItemDelegateForColumn(1, delegate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...