根据从 Sqlite 数据库加载的特定值设置 Pyqt4 TableWidget 背景颜色

Setting Pyqt4 TableWidget background Colour based on certain value loaded from Sqlite Database

我正在尝试根据从 Sqlite 数据库加载的数据的特定值设置 Table 小部件的背景颜色,如下例所示。我在 中看到了以下有效的答案。

问题是,在我的设置中,我使用 TableWidget 和一个按钮(我使用 Qt Designer)从 Sqlite 数据库加载数据,我不太确定如何将下面的代码实现到我的设置中我不完全明白它是如何工作的:

def data(self, item, role):
    if role == Qt.BackgroundRole:
        if QSqlQueryModel.data(self, self.index(item.row(), 2), Qt.DisplayRole) == "Young":
            return QBrush(Qt.yellow)
    if role == Qt.DisplayRole:
        if item.column() == 3:
            return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 1 else False
    return QSqlQueryModel.data(self, item, role) 

下面是我选择 Sqlite 数据并将其显示到 TableWidget 的代码。我正在使用 PyQT4 , Pyhton 2.7 。

self.load_btn.clicked.connect(self.loadData)

def loadData(self):

    ##DB Connection ###

    cursor = conn.cursor()

    query = "SELECT * FROM Tadata"
    cursor.execute(query)
    results = cursor.fetchall()

    self.tableWidget.setRowCount(0)
    for row_number, row_data in enumerate(results):
        self.tableWidget.insertRow(row_number)
        for column_number, data in enumerate (row_data):

            self.tableWidget.setItem(row_number,column_number,QtGui.QTableWidgetItem(str(data)))

使用的数据库是sqlite。 4行4列。Column headers : Number , Company, Equipment , Status 。 'Status' 记录由 'YES' 或 'NO' 组成。所以无论 'NO' 在哪里,我都希望背景是红色的

数据库中我的Table

基于特定值的表格视图颜色

post的解决办法是samples only valid if you use QTableView,QTableWidget不允许建立新的模型,有几个方案可以解决这个问题.

对于示例,我假设数据具有以下形式:

Number      Company     Equipment   Status    
----------  ----------  ----------  ----------
1           company1    Equipment1  YES       
2           company2    Equipment2  NO        
3           company3    Equipmen3   NO        
4           company4    Equipment4  YES 
  • 使用QTableWidgetItem
  • setBackground()方法

self.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(results):
    self.tableWidget.insertRow(row_number)
    for column_number, data in enumerate (row_data):
        self.tableWidget.setItem(row_number,column_number, QTableWidgetItem(str(data)))
        if column_number == 3 and data == "NO":
            [self.tableWidget.item(row_number, c).setBackground(Qt.red) for c in range(len(row_data))]
  • 使用委托:

class Delegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        ix = index.model().index(index.row(), 3)
        if ix.data() == "NO":
            painter.fillRect(option.rect,Qt.red)
        QStyledItemDelegate.paint(self, painter, option, index)

[...]
self.tableWidget.setItemDelegate(Delegate(self.tableWidget))

输出: