QLabel绘制滚动文本

article/2025/10/14 5:44:31

实现思路

绘制滚动文本是个很简单的事,只需要用定时器累计一个文本坐标偏移量,然后 update ,在 paintEvent 里把文本画出来。

Qt 定时刷新可以用(可能还有其他方式):

  • QObject的startTimer配合paintEvent;
  • QBasicTimer配合paintEvent;(源码中很多都用的这个类,我也就用的这个类了)
  • QTimer;
  • QTimeLine;
  • QAnimation;(如果除了滚动还有颜色等动画,建议用动画组实现)

paintEvent 里 QPainter 的设置默认是被样式表影响的,所以我在样式表里设置的颜色和字体。

获取文本高度的时候还有个坑,就是 Qt 文本的 height() 包含基线往上和往下两部分,但是不一定代表字体的真实信息:

我绘制的时候减去了基线底部距离 descent 才显示正常了,不然就没上下居中对齐(直接用 ascent 感觉有点偏),也可以用 Qt5.8 引入的 capHeight:

    /*const int text_height = painter.fontMetrics().capHeight();const int text_y = (height()+text_height) / 2;*/const int text_height = painter.fontMetrics().height();const int text_y = (height()+text_height) / 2-painter.fontMetrics().descent();

实现基本功能之后也可以进行扩展,如颜色变换,在某一位置暂留,多条文本滚动等。 

最终实现

实现效果:

代码链接:

github链接:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/ScrollLabel

主要代码:

#ifndef SCROLLLABEL_H
#define SCROLLLABEL_H#include <QLabel>
#include <QBasicTimer>//滚动文字的label
class ScrollLabel : public QLabel
{Q_OBJECT
public:enum ScrollDirection{ //滚动方向RightToLeft=1,LeftToRight=2};
public:explicit ScrollLabel(QWidget *parent = nullptr);//滚动方向ScrollLabel::ScrollDirection getDirection() const;void setDirection(ScrollLabel::ScrollDirection direction);//刷新间隔int getInterval() const;void setInterval(int interval);protected://basictimer定时器触发void timerEvent(QTimerEvent *event) override;//绘制void paintEvent(QPaintEvent *event) override;//大小变化时重新计算void resizeEvent(QResizeEvent *event) override;private://滚动定时器//也可以使用QTimer QTimeLine QAnimation等实现QBasicTimer scrollTimer;int interval=20;//偏移量int offset=0;int textWidth=0;int labelWidth=0;//默认右往左ScrollDirection direction=RightToLeft;
};#endif // SCROLLLABEL_H
#include "ScrollLabel.h"#include <QTimerEvent>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QPainter>#include <QDebug>ScrollLabel::ScrollLabel(QWidget *parent): QLabel(parent)
{//启动定时器,触发this的timereventscrollTimer.start(interval,this);
}ScrollLabel::ScrollDirection ScrollLabel::getDirection() const
{return direction;
}void ScrollLabel::setDirection(ScrollLabel::ScrollDirection direction)
{if(this->direction!=direction){this->direction=direction;offset=0;}
}int ScrollLabel::getInterval() const
{return interval;
}void ScrollLabel::setInterval(int interval)
{if(this->interval!=interval){this->interval=interval;scrollTimer.start(interval,this);}
}void ScrollLabel::timerEvent(QTimerEvent *event)
{//定时器timeoutif(event->timerId()==scrollTimer.timerId()){event->accept();++offset;if(offset>textWidth+labelWidth){offset=0;}update();}else{QLabel::timerEvent(event);}
}void ScrollLabel::paintEvent(QPaintEvent *event)
{event->accept();QPainter painter(this);const int text_width = painter.fontMetrics().width(text());//字体绘制坐标为左下角,y值就是 labelheight-(labelheight-textheight)/2//因为取的字体高度还受基线影响,height=descent+ascent,这里去掉descent//也可以用Qt5.8提供的capHeight/*const int text_height = painter.fontMetrics().capHeight();const int text_y = (height()+text_height) / 2;*/const int text_height = painter.fontMetrics().height();const int text_y = (height()+text_height) / 2-painter.fontMetrics().descent();if (textWidth != text_width && text_width > 0) {textWidth = text_width;offset = 0;}else {if(direction==RightToLeft){//从右往左painter.drawText(labelWidth - offset, text_y, text());}else{//从左往右painter.drawText(offset - textWidth, text_y, text());}}
}void ScrollLabel::resizeEvent(QResizeEvent *event)
{const int old_width = event->oldSize().width();const int new_width = event->size().width();if (new_width > 10) {labelWidth = new_width;//新宽度更小,就重置偏移if (new_width < old_width) {offset = 0;}}QLabel::resizeEvent(event);
}

 

 


http://chatgpt.dhexx.cn/article/V7sxJaBD.shtml

相关文章

PyQt5 QLabel控件

PyQt5 QLabel控件 QLabel常用方法显示动画超链接 QLabel常用信号 QLabel 就是常见的标签&#xff0c;可以用来显示文字&#xff08;包括纯文本和富文本)&#xff0c;图片及动画。 QLabel常用方法 方法描述margin保存 QLabel 控件中内容与边框之间的距离&#xff08;边距&#…

Qt QLabel详解

一、QLabel常用方法 1. QLabel设置文本内容 ui.label->setText(QStringLiteral("测试中文\n"));2. QLabel设置颜色 通过设计器里面的改变样式进行设置&#xff1a;同时可以设置字体、文本对齐方式、背景图片 color: rgb(255, 85, 0); background-color: rgb(8…

Qt之QLabel(属性 显示图片 显示动图 显示富文本信息 信号)

QLabel可以说是Qt中最常见的控件之一&#xff0c;主要用来显示文本文字、显示图片、显示gif动图、显示富文本信息。本文将从以下几个方面对QLabel进行介绍: [1]显示及获取文本文字 [2]显示图片 [3]显示动图 [4]显示富文本信息 [5]常用属性设置 [6]信号事件 至于样式表(Q…

Qt扫盲-QLabel使用总结

QLabel使用总结 一、QLabel 显示内容二、注意事项1. 格式注意2. 不保留先前状态3. 格式对齐4. 伙伴焦点 三、信号和槽函数使用1. 信号2. 槽函数 总结&#xff1a; QLabel 其实就是一个用来只读显示的简易控件。适合数据量很小的内容显示。 QLabel用于显示 文本或图像。 不提供…

QT常用控件——QLabel标签控件

操作系统: 统信UOSv20 Qt版本: 5.11.3 一&#xff0c;简单介绍 QLabel用于显示文本或图像&#xff0c;不提供用户交互功能&#xff0c;标签的视觉外观可以以各种方式配置。 项目内容HeaderQLabelqmakeQT widgetsInheritsQFrame 二&#xff0c;常用方法 1. 常用方法 方法…

JavaScript 弹出对话框3种方式

js 弹出对话框3种方式对话框有三种 1&#xff1a;只是提醒&#xff0c;不能对脚本产生任何改变&#xff1b; 2&#xff1a;一般用于确认&#xff0c;返回 true 或者 false &#xff0c;所以可以轻松用于 if...else...判断 3&#xff1a;一个带输入的对话框&#xff0c;可以返回…

js的弹出框

js的弹出框包括三种&#xff1a;alert、confirm、prompt 1 alert() alert()方法有一个参数&#xff0c;就是用户想弹出的内容&#xff0c;弹出框很简单&#xff0c;就一个显示功能&#xff0c;你可以点击确认关闭这个弹出框。 例如&#xff1a; alert("hello world&…

JavaScript弹出对话框的三种方法

三种方法 alert(); 最简单&#xff0c;将alert();括号内的内容弹出。 confirm(); 与alert();类似&#xff0c;包含确认和取消按钮&#xff0c;点击确定confirm();方法会返回true&#xff0c;点击取消confirm();方法会返回false&#xff1b; prompt(); 与confirm();方法…

JavaScript弹出框

提到弹出框&#xff0c;首先想到的alert()了&#xff0c;其次想到的也还是alert&#xff08;&#xff09;&#xff0c;其实在js中有三种弹出框&#xff0c;下面我们一一说明。 1&#xff0c;仅确定。 即&#xff1a;对话框界面上只有确定按钮。该功能可以使用alert&#xff08;…

JS弹出对话框的三种方式

javascript的三种对话框是通过调用window对象的三个方法alert()&#xff0c;confirm()和prompt()来获得&#xff0c;可以利用这些对话框来完成js的输入和输出&#xff0c;实现与用户能进行交互的js代码。 第一种&#xff1a;alert()方法 alert()方法是这三种对话框中最容易使用…

JavaScript弹出对话框的三种方式-alert()-confirm()-prompt()

一、alert()警告框&#xff08;确定&#xff09; alert()方法是显示一条弹出提示消息和确认按钮的警告框。 需要注意的是 &#xff1a; alert()是一个阻塞的函数&#xff0c;如果不点确认按钮&#xff0c;后面的内容就不会加载出来。 使用方式&#xff1a; alert(“想要提示的文…

ssh 公钥登录

公钥登录远程主机 ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上。 ssh-copy-id命令也会给远程主机的用户主目录&#xff08;home&#xff09;和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。 ssh-copy-id [-i [identity_file]] [user]m…

SSH登录失败提示Key exchange failed

前两天去配置一台华为5735交换机&#xff0c;到现场才被告知网络中不允许接入私人电脑&#xff0c;要用他们的涉密电脑配置&#xff0c;结果配置完成后测试SSH远程登录失败&#xff0c;提示如下图&#xff1a; 多次检查配置没有发现有什么遗漏&#xff0c;后来询问别人告知是本…

统信UOS配置SSH登录

配置ssh登录 vim /etc/ssh/sshd_config #打开ssh配置文件 Port 22 #开启ssh 22端口 PermitRootLogin yes #允许root登录 systemctl restart sshd #重启sshd服务 使用MobaXterm1_CHS1远程工具测试 登录成功

Oracle云服务器启用SSH登录

Oracle云服务器&#xff08;虚机实例&#xff09;创建创建完成后&#xff0c;打开FinalShell&#xff08;可以使用其他Shell登录工具&#xff09;配置好相应的信息。 在此注意以下两点&#xff1a; 用户名是&#xff1a;Centos系统默认账户是opc&#xff1b;Ubuntu系统默认账户…

通过SSH登录Linux云服务器方法

目录 什么是SSH ? SSH登录云服务器 VScode配置ssh环境 VSCode配置Linux平台C/C编程环境 什么是SSH ? Secure Shell&#xff08;安全外壳协议&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;可在不安全的网络中为网络服务提供安全的传输环境。SSH通…

树莓派SSH登录显示Access Denied

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、2022.4.4版本以前二、2022.4.4版本以后 一、2022.4.4版本以前 补充一个&#xff0c;第一次连接wifi,在内存卡根目录新建wpa_supplicant.conf文件&#xff0c;输…

ESXi开启SSH登录权限

一、使用vmware vSphere client工具登录到esxi主机&#xff0c; 依次点击&#xff1a;主机---配置---安全配置文件---属性 二、 找到SSH,点击选项. 三、点击”启动” 四、点击“确定”保存就可以了。

kali下开启ssh登录的方法

1.netstat -lnt //查看开放是否开放22端口 2.vim /etc/ssh/sshd_config //进入关于ssh的配置文件 3.修改内容&#xff1a; 按i进行编辑修改&#xff1b; 修改完成后按Esc &#xff0c;按&#xff1a;&#xff0c;输入wq保存修改并退出。 4./etc/init.d/ssh…

python实现远程ssh登录

1、安装库 pip install paramiko 2、函数介绍 导入库 import paramiko 创建客户端 ssh paramiko.SSHClient() 设置校验 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 连接登录 ssh.connect(‘192.168.xx.xx’, 22, ‘root’, ‘pwd’) 执行命令 stdin, st…