2017-10-30 45 views
0

QtableViewとQStandardItemModelを使用して、適切な間隔とフィルタログを維持するためにGUI上にログを表示しています。私はモデルを作成し、そこにデータを挿入しました。フィルター文字列にQSortFilterProxyModelを使用しました。QtexteditのようにQtableviewで自動スクロールを有効にするには?

self.tableView = QtGui.QTableView(self) 
self.model = QtGui.QStandardItemModel(self) 
self.proxy = QtGui.QSortFilterProxyModel(self) 
self.proxy.setSourceModel(self.model) 
self.tableView.setModel(self.proxy) 

秒で約100のログが予想され、GUIで表示する必要があります。新しいログが追加されると、ビューは自動スクロールされず、スライダーは一番上に留まります。ロギングのための生き生きとした感覚を与えるものではなく、手動で最後までスクロールする必要があります。だから、これを克服するために、私は次の構文、

self.model.rowsInserted.connect(lambda: QtCore.QTimer.singleShot(5, self.tableView.scrollToBottom)) 

を使用これは、ログのライブ感じを与えるが、スライダーは底に常に残り、私は以前のログを見るためにスクロールアップすることはできませんよ。私がスライダを動かそうとすると、すぐに再び下に下がります。したがって、この構文は私の要件を満たしていません。 QTextEditでは、自動スクロールが適切でユーザーフレンドリーです。 QtableViewでも同じシナリオが必要です。 QTextEditのような自動スクロールの代替手段はありますか?

+0

QTableViewまたはQTreeView:ここ

は簡単なデモで? – eyllanesc

+0

QTableView @eyllanesc –

+0

なぜプロキシを使用しますか? – eyllanesc

答えて

1

必要な動作を得るには、前のスクロール位置が下にあるときにのみ自動スクロールできます。こうすると、ユーザーが下からスクロールするたびに、自動スクロールが無効になります。それらが下にスクロールすると、自動スクロールが再度有効になります。 (注意:自動スクロールをすばやく有効にするには、スクロールバーを右クリックし、コンテキストメニューから「ボトム」を選択します)。

from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.table = QtGui.QTableView(self) 
     self.model = QtGui.QStandardItemModel(self) 
     self.table.setModel(self.model) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 
     self._scroll = True 
     self.model.rowsAboutToBeInserted.connect(self.beforeInsert) 
     self.model.rowsInserted.connect(self.afterInsert) 

    def beforeInsert(self): 
     vbar = self.table.verticalScrollBar() 
     self._scroll = vbar.value() == vbar.maximum() 

    def afterInsert(self): 
     if self._scroll: 
      self.table.scrollToBottom() 

    def addRow(self): 
     self.model.appendRow([QtGui.QStandardItem(c) for c in 'ABC']) 

if __name__ == '__main__': 

    app = QtGui.QApplication(['']) 
    window = Window() 
    window.setGeometry(500, 50, 400, 300) 
    window.show() 
    timer = QtCore.QTimer() 
    timer.timeout.connect(window.addRow) 
    timer.start(200) 
    app.exec_() 
+0

ありがとう、エコモロ、それは動作します:) –

関連する問題