2013-03-27 221 views
1

我需要帮助为我的QTableView着色。 @rainer帮助我在初始化表格时添加颜色,但是现在,我已经有了一个带有数据的表格(但没有颜色//我的数据是在我的表格中打开了一个csv),并且我想创建一个按钮,当点击它时在某些行中对tableview进行着色,比如当有一行有-2(data)时,它将会是带有蓝色的颜色.. - 我有一个按钮和一个表格。该按钮将csv数据加载到我的tableview中。我想要一个新的按钮,使这个表的行变成彩色。 (但只有颜色有数据-2,例如行) 有些代码:pyqt - 用现有数据在QTableView中放置颜色

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) 
+0

'QStandardItem'有一个方法'的setBackground()'你可以用它来设置它的背景色:http://qt-project.org/doc/qt-4.8/qstandarditem.html#setBackground。所以,当你点击第二个按钮时,只需遍历所有行并相应地设置颜色。 – rainer 2013-03-27 20:01:23

回答

2

例如,你可以继承模型,并重新实现data方法,该代码示例将更改单元格背景颜色为蓝色如果选中pushButtonColorize并且单元格的值等于1.它也会影响同一行中的单元格。

#!/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_()) 
+0

谢谢Jacob,但是如果我想改变整个单元的颜色? 像一个列-1,所有单元格=蓝色..对于列0,所有单元格=红色(例如)...我有这样的问题很多:ttributeError:'QString'对象没有属性'isdigit' 回溯(最近一次调用最后一次): 文件“newProgram.py”,第37行,数据为 if(cellData).isdigit()\以及许多像这样的问题:文件“newProgram.py”,行37如果str(cellData).isdigit()\ nicodeEncodeError:'ascii'编解码器无法对位置72-79中的字符进行编码:序号不在范围内(128) 我正在打开csv intomytable – Marco 2013-04-01 18:30:54

+0

对不起,我不认为我理解你问题的第一部分......对于不同的价值是不同的颜色?至于第二部分,你得到的错误可能是由于你的数据编码所致,你必须先将它转换成适当的编码。 – 2013-04-01 19:00:57

+0

第一部分:当我使用按钮时,我只更改数字的颜色,但是我想更改插入此数字的所有单元格的颜色。例如,我有一个矩阵M [3,3],在(1,3)(2,3)(3,3)中有数字,只有在这个地方。但如果我在(1,3)中有-1,我也想改变(1,2)和(1,1)的颜色,对于(1,3)也使用相同的颜色。就像这个行的完整背景 – Marco 2013-04-01 19:09:00