4

PyQt クラスを使用してデータを表示する必要がありますQTableWidget。しかし、数十万行になる可能性があります。シート全体を表示すると、アプリがハングアップします...

そこで、データをロードする (つまり、シートが作成される) がほとんどの行を非表示にし、スクロール バーを移動するときに新しい行を表示し、前の行を非表示にするソリューションを見つけました。

次のコードではself.rowsShown = 50、設定し、初期化で 1 から 50 までの行を表示します。そして、私は以前にやったself.verticalScrollBar().actionTriggered.connect(self.refreshDisplay).

したがって、コードは次のとおりです。

def refreshDisplay(self):
    """
    This is to refresh the display when the scrollbar is moved
    """

    # Minimum is reached and a previous row exists
    if self.verticalScrollBar().value() <= self.verticalScrollBar().minimum() and self.isRowHidden(self.firstRowShown-1):# Minimum is reached and a previous row exists
        for row in xrange(self.lastRowShown-1, self.lastRowShown):
            self.hideRow(row)
            self.lastRowShown -= 1
        for row in xrange(self.firstRowShown-1, self.firstRowShown):
            self.showRow(row)
            self.firstRowShown -= 1
    # Maximum is reached and a next row exists
    if self.verticalScrollBar().value() >= self.verticalScrollBar().maximum() and self.isRowHidden(self.lastRowShown+1):
        for row in xrange(self.firstRowShown, self.firstRowShown+1):
            self.hideRow(row)
            self.firstRowShown += 1
        for row in xrange(self.lastRowShown, self.lastRowShown+1):
            self.showRow(row)
            self.lastRowShown += 1

マウスのロールを使用したり、スクロールバーのボタンをクリックしたりすると、これは非常にうまく機能します。しかし、スライダーをつかむか、キーパッドを使用して選択したケースを移動すると、表示されている領域でブロックされます。

さらに、スクロール領域のサイズは、表示されている行のみに対応します。シートの別の部分にすばやく移動できるように、独自のバー (たとえば、実際の行数に基づくサイズ) を設定するように再定義したいと考えています。ただし、スクロール バーのサイズは、表示される行数で常に更新されます。

ですから、私があなたに期待しているのは、この 2 つの問題を解決するのを手伝ってくれること、またはそのような巨大なシートを表示するための別のアイデアを教えてくれることです。カーソルの移動中に行をロード/表示するというこの機能をすでに備えているモジュールまたはクラスを見逃したのかもしれません。

ありがとう

4

1 に答える 1

2

リソースの問題なしにExcelのようなテーブルに10^6+行を表示するツールを作成しました。QTableView解決策は、とを使用することQAbstractTableModelです。実装する必要のある必要な機能を派生さQAbstractTableModelせて実装する必要があります(覚えていheaderDataますdataが、もっとあると思います)。次に、を実行してモデルをビューに接続しますview.setModel(model)。これがどのように行われるかについての詳細は、ここで見つけることができます。

于 2012-08-23T14:05:19.473 に答える