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

Posted

技术标签:

【中文标题】根据从 Sqlite 数据库加载的特定值设置 Pyqt4 TableWidget 背景颜色【英文标题】:Setting Pyqt4 TableWidget background Colour based on certain value loaded from Sqlite Database 【发布时间】:2018-01-22 10:37:04 【问题描述】:

我正在尝试根据从 Sqlite 数据库加载的数据中的某个值设置 TableWidget 的背景颜色,如下例所示。我在PyQt Tableview background color based on text value rather than True or False 中看到了下面的答案,它有效。

问题是,在我的设置中,我使用 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 列。列标题:编号、公司、设备、状态。 '状态' 记录包括 'YES' 或 'NO' 。所以无论“否”是什么,我都希望背景是红色的

我在数据库中的表

基于特定值的tableview颜色

【问题讨论】:

这个方法只对QTableView有效,QTableWidget不能建立新的模型,你的情况需要你告诉我你的表在数据库里怎么样 @eyllanesc 感谢您的及时回复。 @eyllanesc 感谢您的提示回复!使用的数据库是 sqlite 。 4 行 4 列。列标题:编号、公司、设备、状态。 '状态' 记录包括 'YES' 或 'NO' 。所以无论“否”是什么,我都希望背景是红色的。 编辑您的问题并将其添加到那里 检查我的解决方案,我推荐使用选项 2,它更通用。 【参考方案1】:

那个帖子的解决办法,samples只有使用QTableView才有效,QTableWidget不允许建立新模型,有几种方案可以解决这个问题。

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

Number      Company     Equipment   Status    
----------  ----------  ----------  ----------
1           company1    Equipment1  YES       
2           company2    Equipment2  NO        
3           company3    Equipmen3   NO        
4           company4    Equipment4  YES 
使用setBackground()方法QTableWidgetItem
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))

输出:

【讨论】:

我使用了 QTableWidgetItem 的 setBackground() 方法,但是没有背景色。我将如何或在哪里使用委托方法添加代码? @user3890023 委托在构造函数中建立。如果您仍然有问题,请分享我的代码,我会添加它。 非常感谢。我必须使用选项 1 输入错误。它适用于您的选项 1,我对此很满意。非常感谢你 。非常感谢!!!

以上是关于根据从 Sqlite 数据库加载的特定值设置 Pyqt4 TableWidget 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

Android:从 SQLite 数据库加载

从 SQLite 数据库中检索特定项目

如何在可扩展的listview android中将孩子添加到特定的父母

是否可以根据从 android 中的第一个选择中选择的特定值设置第二个选择的选定值?

在android的sqlite数据库中设置标志

从 SQLite 表 iOS 中检索值