0

カスタムQTableViewとカスタムがありますQAbstractTableModel。ビューでは、単一の選択のみが許可されます。いくつかの条件下で、選択したセルの背景色をカスタマイズしようとしていますが、うまくいきません。dataモデルのselectionChanged方法とビューの方法を組み合わせることでそれができると期待していました。たとえば、選択したセルが特定の行に一致するときに、そのセルの色を変更したいとします。selectionChangedメソッドの私のコードは次のとおりです。

def selectionChanged(self, selected, deselected):
    #QtGui.QTableView.selectionChanged(self, selected, deselected)
    # Get the selected indexes from the QItemSelection object
    selection = selected.indexes()
    # Let the model track the selected cell
    self.tmodel.selected_index = selection[0]
    # Desperately try to make it work
    self.tmodel.dataChanged.emit(selection[0], selection[0])
    self.viewport().update()

dataメソッドの単純化されたコードは次のとおりです。

def data(self, index, role=QtCore.Qt.DisplayRole):
    if not index.isValid():
        return None
    # Some code here dealing with several roles
    if role == QtCore.Qt.DisplayRole:
    ...
    elif role == QtCore.Qt.BackgroundRole:
        if ((index == self.selected_index) and (index.row() == 3)):
            print '++++ displaying selected'
            return QtGui.QColor(QtCore.Qt.yellow)
        else:
            return QtGui.QColor(QtCore.Qt.green)
    else:
        return None

選択されていないセルの背景は、予想どおり緑色です。奇妙なことに、一致する行のセルを選択すると、メッセージ++++ displaying selectedが印刷されますが、選択したセルの背景が黄色ではなくシステムのデフォルトの背景になります。ここで重要/明白な何かが欠けているに違いありませんが、それが何であるかはわかりません。

アップデート

カスタム デリゲートを使用してそのメソッドを実装することで目標を達成できることはわかってpaintいますが、上記のコードが失敗する理由を知りたいです。

4

1 に答える 1

0

わかりました、私はそれを手に入れたと思います。デフォルトのデリゲートはdata、表のセルをレンダリングするために返された値を使用すると考えられます。ドキュメントに従って:

各ロールに適切な項目データを提供することにより、モデルはビューとデリゲートに項目をユーザーに提示する方法に関するヒントを提供できます。さまざまな種類のビューには、必要に応じてこの情報を解釈または無視する自由があります。

したがって、質問で説明されている動作は次のように説明されます。選択されていないセルは、dataメソッドによって返される色が使用されることを意味するデフォルトのデリゲートによって標準的な方法でレンダリングされます。ただし、選択されたセルはデフォルトのデリゲートによって別の方法でレンダリングされますdata。この場合、システム スタイルによって提供される背景が使用されるため、メソッドによって返される値は無視されます。

于 2013-01-26T07:42:41.437 に答える