[PyQt] 在QLabel上用drawText实现文字滚动

4 篇文章 0 订阅
from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
	_fromUtf8 = QString.fromUtf8
except AttributeError:
	def _fromUtf8(s):
		return s
		
class scrollTextLabel(QLabel):
	def __init__(self, parent=None):
		super(scrollTextLabel, self).__init__(parent)
		self.txt = QString()
		self.newX = 10		
		self.t = QTimer()
		self.font = QFont(_fromUtf8('微软雅黑, verdana'), 8)
		self.connect(self.t, SIGNAL("timeout()"), self.changeTxtPosition)
	
	def changeTxtPosition(self):
		if not self.parent().isVisible():
			# 如果parent不可见,则停止滚动,复位
			self.t.stop()
			self.newX = 10
			return
		if self.textRect.width() + self.newX > 0:
		#每次向前滚动5像素
			self.newX -= 5
		else:
			self.newX = self.width()			
		self.update()
	
	#用drawText来绘制文字,不再需要setText,重写
	def setText(self, s):
		self.txt = s
		
		#滚动起始位置设置为10,留下视觉缓冲
		#以免出现 “没注意到第一个字是什么” 的情况
		self.newX = 10
		self.update()
		
	def paintEvent(self, event):
		painter = QPainter(self)
		painter.setFont(self.font)
		#设置透明颜色
		painter.setPen(QColor('transparent'));
		
		#以透明色绘制文字,来取得绘制后的文字宽度
		self.textRect = painter.drawText(QRect(0, -7, self.width(), 25), Qt.AlignHCenter | Qt.AlignVCenter, self.txt)

		if self.textRect.width() > self.width():
			#如果绘制文本宽度大于控件显示宽度,准备滚动:
			painter.setPen(QColor(255, 255, 255, 255))
			painter.drawText(QRect(self.newX, -7, self.textRect.width(), 25), Qt.AlignLeft | Qt.AlignVCenter, self.txt)
			#每150ms毫秒滚动一次
			self.t.start(150)
		else:
			#如果绘制文本宽度小于控件宽度,不需要滚动,文本居中对齐
			painter.setPen(QColor(255, 255, 255, 255));
			self.textRect = painter.drawText(QRect(0, -7, self.width(), 25), Qt.AlignHCenter | Qt.AlignVCenter, self.txt)
			self.t.stop()

当文本长度大于控件宽度,且鼠标悬停时才滚动:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
	_fromUtf8 = QString.fromUtf8
except AttributeError:
	def _fromUtf8(s):
		return s
		
class nameLabel(QLabel):
	def __init__(self, parent=None):
		super(nameLabel, self).__init__(parent)
		self.txt = QString()
		self.newX = 0		
		self.t = QTimer()
		self.font = QFont(_fromUtf8('微软雅黑, verdana'), 8)
		self.connect(self.t, SIGNAL("timeout()"), self.changeTxtPosition)
	
	def changeTxtPosition(self):
		if not self.parent().isVisible():
			self.t.stop()
			self.newX = 0
			return
		if self.textRect.width() + self.newX > 0:
			self.newX -= 5
		else:
			self.newX = self.width()			
		self.update()
	
	def setText(self, s):
		self.txt = s
		self.newX = 0
		self.update()
		
	def enterEvent(self, event):
		self.t.start(150)
		
	def leaveEvent(self, event):
		#鼠标离开则停止滚动并复位
		self.t.stop()
		self.newX = 0
		self.update()
		
	def paintEvent(self, event):
		painter = QPainter(self)
		painter.setFont(self.font)
		painter.setPen(QColor('transparent'));
		self.textRect = painter.drawText(QRect(0, -7, self.width(), 25), Qt.AlignHCenter | Qt.AlignVCenter, self.txt)

		if self.textRect.width() > self.width():	
			painter.setPen(QColor(255, 255, 255, 255)); #白色
			painter.drawText(QRect(self.newX, -7, self.textRect.width(), 25), Qt.AlignLeft | Qt.AlignVCenter, self.txt)			
		else:
			painter.setPen(QColor(255, 255, 255, 255));#白色
			self.textRect = painter.drawText(QRect(0, -7, self.width(), 25), Qt.AlignLeft | Qt.AlignVCenter, self.txt)
			self.t.stop()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值