1

我想要一个表格小部件,它可以根据某些条件和阈值对某些行进行着色。例如,如果一列中的数据超过 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)
4

3 回答 3

2

如果您的单元格包含整数,您应该尝试:

int(newitem.text()) >= 20
于 2012-08-14T16:38:22.033 回答
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):
    ...
于 2012-08-15T18:13:53.063 回答
1

Joaquin 的观点是您正在将一个字符串 (newitem.text()) 与另一个字符串 ('20') 进行比较。这是一个字母比较——'3' > '200'例如,即使数字 3 < 数字 200。您描述的规则是数字之间的比较,因此您需要将 newitem.text() 转换为数字。

请注意,即使您在小部件中输入“数字”,它们也会作为字符串存储和检索。int(newitem.text())把它变回一个数字。

于 2012-08-14T18:59:20.267 回答