PyQt5:如何在QTextEdit中自动滚动文本(动画效果)?

时间:2018-01-10 03:30:57

标签: python pyqt pyqt5 qtextedit

我想问一下如何在QTextEdit scoll中制作文本,以实现动画效果。动画效果应该类似于视频节目中的内容:https://www.youtube.com/watch?v=MyeuGdXv4XM

使用PyQt我想得到这个效果: 文本应该以2行/秒的速度自动收起,直到它到达终点并停止。

在下面的代码中,单击按钮时,文本显示在QTextEdit-Widget中。文本很长,因此显示滚动条。

我的问题: 我不知道如何制作动画效果。因此,我想请求您帮助更正我的代码。

<Resource
    name="jdbc/myDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    username="user"
    password="encryptedpassword"
    driverClassName="driverClass"
    factory="mypackage.MyCustomBasicDataSourceFactory"
    url="jdbc:blabla://..."/>

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你想要的任务并不重,它是周期性的,所以使用一个线程是不合适的,对于这项任务,我们可以使用QVariantAnimation

另一部分是创建一个移动到特定文本行的方法,我们在QTextCursor的{​​{1}}旁边使用findBlockByLineNumber()

对于最后一个,我们必须开始移动到最后一个可见的初始值,我们使用QTextDocument方法通过cursorForPosition()的大小。

viewport()

<强>更新

如果您想要连续移动,则必须使用longText = "\n".join(["{}: long text - auto scrolling ".format(i) for i in range(100)]) class AnimationTextEdit(QTextEdit): def __init__(self, *args, **kwargs): QTextEdit.__init__(self, *args, **kwargs) self.animation = QVariantAnimation(self) self.animation.valueChanged.connect(self.move) @pyqtSlot() def startAnimation(self): self.animation.stop() lines_per_second = 2 self.moveToLine(0) p = QPoint(self.viewport().width() - 1, self.viewport().height() - 1) cursor = self.cursorForPosition(p) self.animation.setStartValue(cursor.blockNumber()) self.animation.setEndValue(self.document().blockCount()-1) self.animation.setDuration(self.animation.endValue()*1000/lines_per_second) self.animation.start() @pyqtSlot(QVariant) def move(self, i): cursor = QTextCursor(self.document().findBlockByLineNumber(i)) self.setTextCursor(cursor) class MyApp(QWidget): def __init__(self): super(MyApp, self).__init__() self.setFixedSize(600, 400) self.txt = AnimationTextEdit(self) self.btn = QPushButton("Start", self) self.layout = QHBoxLayout(self) self.layout.addWidget(self.txt) self.layout.addWidget(self.btn) self.txt.append(longText) self.txt.move(0) self.btn.clicked.connect(self.txt.startAnimation) if __name__ == "__main__": app = QApplication(sys.argv) window = MyApp() window.show() sys.exit(app.exec_())

verticalScrollBar()