QLabel实现跑马灯滚字效果
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimerEvent>
#include <QPainter>
#include <QDebug>
#include <QTimer>
#include <QFont>
#include <QFontMetrics>
#include <QSize>
#include <QRectF>
//实现QLable 跑马灯效果
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void display_text();
private:
Ui::MainWindow *ui;
int width;//QLable的长宽
int hight;
/*方式一:通过定时器实现 */
QString text;//需要显示的文本
QString d_text;//正在显示的文本
QTimer* timer;//定时器
int text_width;//需要显示的文本宽度
int d_text_width;//正在显示的文本宽度
int d_index;//填充文本索引
int space_count;//填充空格计数
};
#endif // MAINWINDOW_H
源码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer();
this->width = ui->label->size().width();
this->hight=ui->label->size().height();
ui->label->clear();
ui->label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
text="Hello World! 深圳欢迎您!...";
text_width=fontMetrics().width(text);
d_text_width=0;
d_index=0;
space_count=0;
//方式一 通过定时器 定时修改显示文本
connect(timer,SIGNAL(timeout()),this,SLOT(display_text()));
timer->start(100);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::display_text()
{
if(d_text_width-text_width > this->width){//当文本像素宽度大于label的宽度时,则重新初始化
ui->label->clear();
d_text.clear();
d_index=0;
d_text_width=0;
}
if(space_count>=10){//当填充的空格大于10个时,开始继续填充文本
space_count=0;
d_index=0;
}
if(d_index < text.length()){
d_text+=text.at(d_index);
d_index++;
}
else{
d_text += " ";
space_count++;
}
d_text_width=fontMetrics().width(d_text);
// qDebug()<<d_text_width<<" "<< text_width<<" "<<d_index<<" "<<d_text;
ui->label->setText(d_text);
}