我希望有一个tablewidget,它会根据某些条件和阈值为某些行着色。例如,如果一列中的数据超过20,则会为该20的行着色。我只通过Qtablewidgetitem搜索它并没有按照我的意愿去做。
def setmydata(self):
for n, key in enumerate(self.data):
for m, item in enumerate(self.data[key]):
newitem = QtGui.QTableWidgetItem(item)
c = newitem.column() + 2
print c
for items in item:
if newitem.text() >= '20' or newitem.text() == 'WARNING':
newitem.setBackground(QtGui.QBrush(QtCore.Qt.yellow))
else:
pass
self.setItem(m, n, newitem)
答案 0 :(得分:2)
如果您的单元格包含整数,则应尝试:
int(newitem.text()) >= 20
答案 1 :(得分:2)
对于包含数据的现有表,您希望迭代特定列,您可以执行以下操作:
def process_column(table, processCol=0):
for row in xrange(table.rowCount()):
item = table.item(row, processCol)
text = str(item.text())
if (text.isdigit() and int(text) >= 20) or text == 'WARNING':
item.setBackground(QtGui.QBrush(QtCore.Qt.yellow))
或者要设置整行颜色,您需要循环遍历列以在匹配时获取每个行项目:
def process_column(table, processCol=0):
colCount = table.rowCount()
for row in xrange(table.rowCount()):
item = table.item(row, processCol)
text = str(item.text())
if (text.isdigit() and int(text) >= 20) or text == 'WARNING':
for col in xrange(colCount):
item = table.item(row, col)
item.setBackground(QtGui.QBrush(QtCore.Qt.yellow))
正如其他问题也指出的那样,你需要将int与int进行比较,而不是字符串比较。我在这里做的是首先检查单元格实际上是一个int以使它保存。因为如果你的单元格实际上是“警告”,那么首先将它转换为int会崩溃。
无论如何,即使函数位于不同的类中,您也需要引用QTableWidget
。这意味着你需要提前设置你的信号,如果其他类从未明确知道它的话。一个例子是使用将表绑定到它的partial
回调:
from functools import partial
class Foo:
def __init__(self):
self.the_table = QTableWidget()
# create a callback with the table bound as first arg
callback = partial(process_column, self.the_table)
# set some signal that emits a column number
self.process_column_signal.connect(callback)
def some_method(self):
# process column 0
self.process_column_signal.emit(0)
# will get called by process_column_signal with the table
def process_column(table, processCol):
...
答案 2 :(得分:1)
Joaquin的观点是你将字符串(newitem.text())与另一个字符串('20')进行比较。这是一个按字母顺序排列的比较 - '3' > '200'
,例如,即使数字3 <数字200.您描述的规则是数字之间的比较,因此您需要将newitem.text()转换为数字。
请注意,即使您在窗口小部件中输入“数字”,它们也会以字符串形式存储和检索。 int(newitem.text())
将其变回一个数字。