【问题标题】:Retrieving data from columns qtablewidget从列 qtablewidget 检索数据
【发布时间】:2012-08-11 00:15:03
【问题描述】:

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

【问题讨论】:

  • newitem.text() >= '20' 你不是在比较数字,只是比较字符串

标签: python pyqt qtablewidget qtablewidgetitem


【解决方案1】:

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

int(newitem.text()) >= 20

【讨论】:

  • 但是,在不同的列中有不同比例的整数(例如,当整数超过 9 时,我希望它们被着色)。
  • 在表格中既有整数也有字符串,但是,我最好只搜索列并使用所选列执行 newitem.text。
【解决方案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 first 以使其保存。因为如果您的单元格实际上是“警告”,那么首先将其转换为 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):
    ...

【讨论】:

  • 好的,除了应该设置行背景时,一切正常,它显示AttributeError: 'QString' object has no attribute 'setBackground'。谢谢!
  • 哈。哎呀。那是一个错字。它应该是item.setBackground,而不是文本值。固定。
  • 嘿,有没有给整行上色?
【解决方案3】:

Joaquin 的观点是,您将一个字符串 (newitem.text()) 与另一个字符串 ('20') 进行比较。这是一个字母比较——例如'3' > '200',即使数字 3

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

【讨论】:

  • 是的,但我的问题是如何从各个列中获取数据然后处理数据?
  • 你指的是什么data? QTableWidget 中的 QTableWidgetItems? QTableWidgetItem 中的文本?您通过 setData 存储在 QTableWidgetItem 中的用户数据?
  • QTableWidgetitem 中的文本,例如,如果我有 3 个列,a b c,我要做的是选择 a 及其数据并处理它,然后是 b,然后是 c。
  • 您使用 QTableWidgetItem.text() 就像您的示例一样。使用QTableWidget.item(i, j).text() 获取存储在表中第 i 行第 j 列的文本。使用int() 将其转换为数字。根据需要重复以获取您需要的内容。 riverbankcomputing.co.uk/static/Docs/PyQt4/html/…
  • 我不能使用它,因为我的 qtablewidget 属于不同的类。当我尝试在其他类中调用 qtablewidget 时,它说该类没有属性qtablewidget
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2019-08-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2012-04-18
相关资源
最近更新 更多