3

QTableViewに接続されたPyQtがありQAbstractTableModel、それ自体がアイテムのリストを管理するカスタムクラスに接続されています。リストの最後にアイテムを挿入すると、モデルに適切に通知され、モデルはとを呼び出しbeginInsertRowsますendInsertRows。これらの関数の両方を呼び出し、リスト自体が更新されていることを確認できますが、テーブルがdata更新された行を取得するために呼び出すことはありません。

どうしたの?どうすれば修正できますか?

class FigureTableModel(QAbstractTableModel):
    def __init__(self):
        QAbstractTableModel.__init__(self)

        def changed(index):
            start_index = self.createIndex(index, 0)
            end_index = self.createIndex(index, COLUMNS - 1)
            self.dataChanged.emit(start_index, end_index)

        def adding_row(index):
            self.beginInsertRows(self.createIndex(0, 0), index, index)
            print 'adding ', index

        def added_row(index):
            self.endInsertRows()
            print 'added'

        figures.dataChanged.connect(changed)
        figures.rowAdding.connect(adding_row)
        figures.rowAdded.connect(added_row)

    def rowCount(self, parent):
        return len(figures)

    def columnCount(self, parent):
        return COLUMNS

    def data(self, index, role):
        print 'in data'
        if not index.isValid():
            return EMPTY

        return figures[index.row()].get_table_item(index.column(), role)
4

1 に答える 1

3

問題の原因が1つあると思います。それはラインについてです:

self.beginInsertRows(self.createIndex(0, 0), index, index)

self.createIndex(0, 0)有効なを作成しますQModelIndex。これはで参照しparentbeginInsertRowsいるので、基本的には、テーブルの最初の行に子を追加することをビューに伝えています。テーブルには子の概念がないため(階層的ではありません)、何もしません。

テーブルの場合、parentは無効QModelIndexである必要があります。これは、アイテムがルートにあることを意味します。したがって、次を使用する必要があります。

self.beginInsertRows(QtCore.QModelIndex(), index, index)
# or depending on how you import
self.beginInsertRows(QModelIndex(), index, index)

そうは言っても、奇妙なことに私を驚かせたことがいくつかあります。

まず、メソッドの外部では、通常、直接index呼び出すことは避けてください。createIndexそうでなければ、物事を台無しにするのは簡単です。indexメソッド自体は、QModelIndexインスタンスを作成する一貫した方法を提供する必要があります。あなたの場合、継承するQAbstractTableModelので、indexメソッドはすでに実装されています。

次に、グローバル変数を使用しています。多くの。それは一般的に悪い習慣と考えられています。クラスで必要な場合は、に渡します__init__。たとえば、現在、2つの独立したモデルをインスタンス化することはできません。どちらも同じグローバルfigure変数を使用するためです。EMPTYまたは、何を指しているのかわかりませんが、無効なタイプのdata場合は単に返す必要があります。None別の名前は必要ありません。COLUMNS同様に、から取得できるfigures必要があります。明示的な値が必要な場合は、それをに渡す必要があります__init__

于 2012-10-29T02:08:15.687 に答える