1

特定の条件としきい値に基づいて行の一部に色を付けるテーブルウィジェットが必要です。たとえば、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 に答える