QT 字幕滚动(左右滚动)
来源:互联网 发布:快递数据 编辑:程序博客网 时间:2024/04/30 14:25
// 这里我就已一句话为例,如果存在什么换行之类的请参考 “QT 字幕滚动(上下滚动)” 进行处理
// 这里我就贴上代码,具体就不详细说明
----------------------------- HScrolllabel.h---------------------------------
#ifndef HSCROLLLABEL_H
#define HSCROLLLABEL_H
#include <QLabel>
class HScrollLabel : public QLabel
{
Q_OBJECT
public:
explicit HScrollLabel(QWidget *parent = 0, Qt::WindowFlags f=0);
virtual ~HScrollLabel(){}
public slots:
void setText(const QString &);
signals:
void currentTextChanged();
protected:
void showEvent(QShowEvent *);
void paintEvent(QPaintEvent *);
void timerEvent(QTimerEvent *);
void hideEvent(QHideEvent *);
private slots:
void metrics();
void startScroll();
private:
int getWidth();
private:
int offset;
int timerID;
int textWidth;
bool flag;
};
#endif // HSCOLLLABEL_H
----------------------------- HScrolllabel.cpp---------------------------------
#include "hscrolllabel.h"
#include <QPainter>
#include <QTimerEvent>
#include <QTimer>
HScrollLabel::HScrollLabel(QWidget *parent, Qt::WindowFlags f) :
QLabel(parent,f)
{
flag = false;
offset = timerID = textWidth = 0;
connect(this, SIGNAL(currentTextChanged()), SLOT(metrics()));
}
void HScrollLabel::setText(const QString &curText)
{
if (text() != curText) {
QLabel::setText(curText);
QLabel::setAlignment(Qt::AlignCenter);
emit currentTextChanged();
}
}
void HScrollLabel::startScroll()
{
timerID = startTimer(50);
}
void HScrollLabel::metrics()
{
flag = false;
offset = 0;
textWidth = 0;
if(getWidth() < width())
return;
flag = true;
textWidth = getWidth() +width();
QTimer::singleShot(500, this, SLOT(startScroll()));
}
int HScrollLabel::getWidth()
{
int fm_width = fontMetrics().width(text());
return fm_width;
}
void HScrollLabel::showEvent(QShowEvent *)
{
metrics();
}
void HScrollLabel::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//if (textWidth < 1) return;
if(!flag)
{
painter.drawText(0, 0, width(), height() ,
Qt::AlignHCenter | Qt::AlignVCenter, text());
return;
}
int x = -offset ;
while (x < width()) {
painter.drawText(x, 0, textWidth, height() ,
Qt::AlignHCenter | Qt::AlignVCenter, text());
x += textWidth;
}
}
void HScrollLabel::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timerID) {
++offset;
if (offset >= textWidth)
offset = 0;
scroll(-3, 0); // 这里是从右向左滚动
} else {
QWidget::timerEvent(event);
}
}
void HScrollLabel::hideEvent(QHideEvent *)
{
offset = 0;
if (timerID) killTimer(timerID);
// 这里我就贴上代码,具体就不详细说明
----------------------------- HScrolllabel.h---------------------------------
#ifndef HSCROLLLABEL_H
#define HSCROLLLABEL_H
#include <QLabel>
class HScrollLabel : public QLabel
{
Q_OBJECT
public:
explicit HScrollLabel(QWidget *parent = 0, Qt::WindowFlags f=0);
virtual ~HScrollLabel(){}
public slots:
void setText(const QString &);
signals:
void currentTextChanged();
protected:
void showEvent(QShowEvent *);
void paintEvent(QPaintEvent *);
void timerEvent(QTimerEvent *);
void hideEvent(QHideEvent *);
private slots:
void metrics();
void startScroll();
private:
int getWidth();
private:
int offset;
int timerID;
int textWidth;
bool flag;
};
#endif // HSCOLLLABEL_H
----------------------------- HScrolllabel.cpp---------------------------------
#include "hscrolllabel.h"
#include <QPainter>
#include <QTimerEvent>
#include <QTimer>
HScrollLabel::HScrollLabel(QWidget *parent, Qt::WindowFlags f) :
QLabel(parent,f)
{
flag = false;
offset = timerID = textWidth = 0;
connect(this, SIGNAL(currentTextChanged()), SLOT(metrics()));
}
void HScrollLabel::setText(const QString &curText)
{
if (text() != curText) {
QLabel::setText(curText);
QLabel::setAlignment(Qt::AlignCenter);
emit currentTextChanged();
}
}
void HScrollLabel::startScroll()
{
timerID = startTimer(50);
}
void HScrollLabel::metrics()
{
flag = false;
offset = 0;
textWidth = 0;
if(getWidth() < width())
return;
flag = true;
textWidth = getWidth() +width();
QTimer::singleShot(500, this, SLOT(startScroll()));
}
int HScrollLabel::getWidth()
{
int fm_width = fontMetrics().width(text());
return fm_width;
}
void HScrollLabel::showEvent(QShowEvent *)
{
metrics();
}
void HScrollLabel::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//if (textWidth < 1) return;
if(!flag)
{
painter.drawText(0, 0, width(), height() ,
Qt::AlignHCenter | Qt::AlignVCenter, text());
return;
}
int x = -offset ;
while (x < width()) {
painter.drawText(x, 0, textWidth, height() ,
Qt::AlignHCenter | Qt::AlignVCenter, text());
x += textWidth;
}
}
void HScrollLabel::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timerID) {
++offset;
if (offset >= textWidth)
offset = 0;
scroll(-3, 0); // 这里是从右向左滚动
} else {
QWidget::timerEvent(event);
}
}
void HScrollLabel::hideEvent(QHideEvent *)
{
offset = 0;
if (timerID) killTimer(timerID);
}
- QT 字幕滚动(左右滚动)
- Qt之滚动字幕
- Qt 字幕滚动程序
- Qt实现滚动字幕
- QT 实现字幕滚动(上下滚动)
- Qt实现滚动字幕效果
- Qt 水平滚动字幕2
- [转载]Qt 水平滚动字幕
- MFC操作——字幕左右滚动
- 滚动字幕
- 滚动字幕
- 滚动字幕
- 滚动字幕
- 滚动字幕
- 滚动字幕
- 滚动字幕
- 滚动字幕
- QT滚动字幕代码(包括中英文截取)
- 百度地图不能从定位的BDLocation里获取地址怎么办?
- centos网卡配置
- 栈的链式存储及其基本运算
- 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
- QT necessitas 给工程重命名
- QT 字幕滚动(左右滚动)
- Codeforces Round #182 (Div. 2) / 302A Eugeny and Array(模拟)
- JSTL详解(六)
- 小学生算数
- interprocess communication (IPC) 进程间通信
- Struts2 result-type(转自百度文库)
- HDU 4666 经典的求最远曼哈顿距离
- Framework中的Ril源码分析(原)
- 浅谈公开密钥加密技术