Как автоматически скроллить QScrollArea вниз?
Есть QScrollArea, к нему привязан QLabel(если есть способ с QTextEdit и т.д., то не принципиально).
Необходимо сделать некий эффект консоли, когда появляется новая строка, автоматически скролится вниз, чтобы эту строку увидеть.
Пробовал гуглить как на русском, так и на английском. Хоть подобные темы и были найдены(на английском), методы и решения оттуда не помогли.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Один из способов может быть использование сигнала rangeChanged вертикальная полоса прокрутки и, при необходимости, смещение его вниз, например:
from PyQt5 import QtCore, QtWidgets
class Main(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.maxStart = 0
self.i = 25
self.widget = QtWidgets.QWidget(self)
self.scrollArea = QtWidgets.QScrollArea()
self.layout = QtWidgets.QVBoxLayout(self.widget)
self.scrollArea.setWidget(self.widget)
self.scrollArea.setWidgetResizable(True)
self.setCentralWidget(self.scrollArea)
self._vbar = self.scrollArea.verticalScrollBar()
# испускается, когда диапазон значений полосы прокрутки изменился.
self._vbar.rangeChanged.connect(self.scroll_to_end) # <<<=====
self._scroll_items = 0
for i in range(25):
w = QtWidgets.QWidget(self)
layout = QtWidgets.QHBoxLayout(w)
label = QtWidgets.QLabel(f"loop {i}")
layout.addWidget(label)
self.layout.addWidget(label)
self._timer = QtCore.QTimer(self, interval=1000)
self._timer.timeout.connect(self.addLabel)
self._timer.start()
def addLabel(self):
w = QtWidgets.QWidget(self)
layout = QtWidgets.QHBoxLayout(w)
label = QtWidgets.QLabel(f"loop {self.i}")
layout.addWidget(label)
self.layout.addWidget(label)
self.i += 1
@QtCore.pyqtSlot(int , int)
def scroll_to_end(self, _min, _max):
items = self.layout.count()
if self.maxStart != _max:
self._vbar.setValue(_max)
self._scroll_items = items
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
m = Main()
m.resize(700, 600)
m.show()
sys.exit(app.exec_())
