我想问一下如何在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://..."/>
非常感谢您的帮助!
答案 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()