根据从 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))
输出:
我正在尝试根据从 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))
输出: