2

QTableView に色を付けるには助けが必要です。@rainerは、テーブルを初期化するときに色を付けるのを手伝ってくれましたが、現在、データを含むテーブルが既にあります(ただし、色はありません//データはテーブルで開かれたcsvです)。クリックしたときにボタンを作成したい-2(データ)の行がある場合のように、いくつかの行でテーブルビューに色を付けます.--ボタンとテーブルがあります。このボタンは、csv データをテーブルビューにロードします。このテーブルの行に色を付ける新しいボタンが必要です。(ただし、たとえば、-2 のデータを持つ行のみに色を付けます) いくつかのコード:

    self.fileName = (_fromUtf8('tweets.csv'))
    self.tableView = QTableView(self.tabSentimento)
    self.tableView.setGeometry(QRect(550,10,510,700))
    self.tableView.setObjectName(_fromUtf8("TabelaSentimento"))
    self.tableView.setModel(self.model)
    self.tableView.horizontalHeader().setStretchLastSection(True)

    self.pushButtonLoad = QPushButton(self.tabSentimento)
    self.pushButtonLoad.setGeometry(QRect(550,720,130,30))
    self.pushButtonLoad.setObjectName(_fromUtf8("buttonLoadCSV"))
    self.pushButtonLoad.setText(QApplication.translate("Form", "Process!", None, QApplication.UnicodeUTF8))
    self.pushButtonLoad.setStyleSheet('color:red;background-color:rgb(255, 255, 153);border:1px solid purple;')
    self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)


    def loadCsv(self, fileName):
        with open(fileName, "rb") as fileInput:
            for row in csv.reader(fileInput):    
                items = [
                    QStandardItem(field)
                    for field in row
            ]
                self.model.appendRow(items)

    def on_pushButtonLoad_clicked(self):
        print self.fileName
        self.loadCsv(self.fileName)
4

1 に答える 1

4

たとえば、モデルをサブクラス化し、メソッドを再実装することができます。このコード例では、がチェックされ、セルの値が 1 に等しいdata場合、セルの背景色を青に変更します。同じ行のセルにも影響します。pushButtonColorize

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

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

import random
from PyQt4 import QtGui, QtCore

class MyStandardItemModel(QtGui.QStandardItemModel):
    _colorize = False
    def __init__(self, parent=None):
        super(MyStandardItemModel, self).__init__(parent)

    def setColorized(self, state):
        self._colorize = state

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.BackgroundColorRole \
        and not self._colorize:
            return QtGui.QBrush()

        return super(MyStandardItemModel, self).data(index, role)

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

        self.pushButtonColorize = QtGui.QPushButton(self)
        self.pushButtonColorize.setText("Colorize Cells!")
        self.pushButtonColorize.setCheckable(True)
        self.pushButtonColorize.toggled.connect(self.on_pushButtonColorize_toggled)

        self.pushButtonReload = QtGui.QPushButton(self)
        self.pushButtonReload.setText("Reload Data!")
        self.pushButtonReload.clicked.connect(self.on_pushButtonReload_clicked)

        self.modelSource = MyStandardItemModel(self)

        self.tableView = QtGui.QTableView(self)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.setModel(self.modelSource)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.pushButtonReload)
        self.layoutVertical.addWidget(self.pushButtonColorize)
        self.layoutVertical.addWidget(self.tableView)

        self.pushButtonReload.click()

    @QtCore.pyqtSlot()
    def on_pushButtonReload_clicked(self):
        self.modelSource.clear()

        for rowNumber in range(3):
            items = []
            for columnNumber in range(3):
                item = QtGui.QStandardItem()
                item.setText(str(random.getrandbits(1)))

                items.append(item)

            self.modelSource.appendRow(items)

        if self.pushButtonColorize.isChecked():
            self.on_pushButtonColorize_toggled(True)

    @QtCore.pyqtSlot(bool)
    def on_pushButtonColorize_toggled(self, state):
        self.modelSource.setColorized(state)

        rowCount    = self.modelSource.rowCount()
        columnCount = self.modelSource.columnCount()

        for rowNumber in range(rowCount):
            for columnNumber in range(columnCount):
                cellIndex = self.modelSource.index(rowNumber, columnNumber)
                cellData  = self.modelSource.data(cellIndex, QtCore.Qt.DisplayRole)

                if str(cellData).isdigit() \
                and int(cellData) == 1:
                    for cellColumn in range(columnCount):
                        self.modelSource.setData(
                            self.modelSource.index(rowNumber, cellColumn),
                            QtGui.QColor(QtCore.Qt.blue),
                            QtCore.Qt.BackgroundColorRole
                        )

        self.modelSource.endResetModel()

if __name__ == "__main__":
    import sys

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

    main = MyWindow()
    main.resize(333, 222)
    main.show()

    sys.exit(app.exec_())
于 2013-03-27T20:37:12.257 に答える