您的位置:首页 > 产品设计 > UI/UE

QT控件大全 十三 WidgetMarqueeLabel

2017-12-08 08:46 393 查看
WidgetMarqueeLabel跑马灯控制器:可选择颜色,可控制速度,选择字体等







核心代码:

#ifndef _WIDGETMARQUEELABEL_H_
#define _WIDGETMARQUEELABEL_H_

#include <QLabel>
#include <QTimer>

class WidgetMarqueeLabel : public QLabel
{
Q_OBJECT

public: //Member Functions
enum Direction{LeftToRight,RightToLeft};
WidgetMarqueeLabel(QWidget *parent = 0);
~WidgetMarqueeLabel();
void show();
void setAlignment(Qt::Alignment);
int getSpeed();

public slots: //Public Member Slots
void setSpeed(int s);
void setDirection(int d);

protected: //Member Functions
void paintEvent(QPaintEvent *evt);
void resizeEvent(QResizeEvent *evt);
void updateCoordinates();

private: //Data Members
int px;
int py;
QTimer timer;
Qt::Alignment m_align;
int speed;
int direction;
int fontPointSize;
int textLength;

private slots: //Private Member Slots
void refreshLabel();
};
#endif /*_WIDGETMARQUEELABEL_H_*/

#include "WidgetMarqueeLabel.h"
#include <QPainter>

WidgetMarqueeLabel::WidgetMarqueeLabel(QWidget *parent)
{
px = 0;
py = 15;
speed = 2;
direction = LeftToRight;
connect(&timer, SIGNAL(timeout()), this, SLOT(refreshLabel()));
timer.start(10);
}

void WidgetMarqueeLabel::refreshLabel()
{
repaint();
}

WidgetMarqueeLabel::~WidgetMarqueeLabel()
{}

void WidgetMarqueeLabel::show()
{
QLabel::show();
}

void WidgetMarqueeLabel::setAlignment(Qt::Alignment al)
{
m_align = al;
updateCoordinates();
QLabel::setAlignment(al);
}

void WidgetMarqueeLabel::paintEvent(QPaintEvent *evt)
{
QPainter p(this);
if(direction==RightToLeft)
{
px -= speed;
if(px <= (-textLength))
px = width();
}
else
{
px += speed;
if(px >= width())
px = - textLength;
}
p.drawText(px, py + fontPointSize, text());
p.translate(px,0);
}

void WidgetMarqueeLabel::resizeEvent(QResizeEvent *evt)
{
updateCoordinates();
QLabel::resizeEvent(evt);
}

void WidgetMarqueeLabel::updateCoordinates()
{
switch(m_align)
{
case Qt::AlignTop:
py = 10;
break;
case Qt::AlignBottom:
py = height()-10;
break;
case Qt::AlignVCenter:
py = height()/2;
break;
}
fontPointSize = font().pointSize()/2;
textLength = fontMetrics().width(text());
}

void WidgetMarqueeLabel::setSpeed(int s)
{
speed = s;
}

int WidgetMarqueeLabel::getSpeed()
{
return speed;
}

void WidgetMarqueeLabel::setDirection(int d)
{
direction = d;
if (direction==RightToLeft)
px = width() - textLength;
else
px = 0;
refreshLabel();
}


源码工程:QQ:609162385
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: