从qtablewidget列中检索数据

时间:2012-08-14 16:33:42

标签: python pyqt qtablewidget qtablewidgetitem

我希望有一个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)

3 个答案:

答案 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())将其变回一个数字。