2017-10-30 24 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

대단히 감사합니다, 그것은 작동합니다. :) –