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

本文介绍了一种使用 PyQt4 实现滚动文本控件的方法。通过自定义 QLabel 类,结合 QTimer 控制定时更新文本位置,实现了当文本长度超过控件宽度时的自动滚动效果,并提供了鼠标悬停时才启动滚动的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()
要将yolov5检测信息显示在pyqt界面上,可以按照以下步骤进行: 1. 在pyqt界面上添加一个QLabel控件,用于显示检测结果。 2. 在yolov5检测代码中,获取检测结果,并将结果转换为字符串格式。 3. 将检测结果字符串设置为QLabel的文本内容,即可在界面上显示检测结果。 以下是示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtGui import QPixmap from yolov5.detect import detect # yolov5检测函数 class MyWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(100, 100, 500, 500) self.setWindowTitle('yolov5检测结果') # 添加QLabel控件用于显示检测结果 self.label = QLabel(self) self.label.setGeometry(10, 10, 480, 480) # 调用yolov5检测函数,获取检测结果 img_path = 'test.jpg' # 待检测的图像路径 result = detect(img_path) # 将检测结果转换为字符串格式 result_str = '\n'.join([f'{label}: {conf:.2f}' for label, conf in result]) # 将检测结果字符串设置为QLabel的文本内容 self.label.setText(result_str) # 将检测结果绘制在图像上 pixmap = QPixmap(img_path) painter = QtGui.QPainter(pixmap) for label, conf, bbox in result: x1, y1, x2, y2 = bbox painter.drawRect(x1, y1, x2-x1, y2-y1) painter.drawText(x1, y1-5, f'{label}: {conf:.2f}') painter.end() self.label.setPixmap(pixmap) if __name__ == '__main__': app = QApplication(sys.argv) ex = MyWidget() ex.show() sys.exit(app.exec_()) ``` 在上述代码中,`yolov5.detect.detect`函数用于进行检测,返回值是一个列表,每个元素包含标签名、置信度和边界框坐标,例如:`[('person', 0.98, [100, 200, 300, 400]), ('car', 0.92, [200, 300, 400, 500])]`。 将检测结果转换为字符串格式后,设置为QLabel的文本内容,即可在界面上显示检测结果。同时,可以将检测结果绘制在图像上,以便更直观地展示检测效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值