Qt界面边框跑马灯(附代码)

1、效果:
在这里插入图片描述
2、思路:
在需要设计边框的界面上下左右各放一个label,每个label对应一副图像,while循环一次则图像变一次,图像变了则重新把图像绘制到label中。
3、源码:
GuiLight.h

#pragma once

#include <QtCore/qthread.h>
#include <QtGui/QMouseEvent>
#include <QtWidgets/QPushButton>
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
#include <QtGui/QImage>
#include <QtWidgets/QtWidgets>
#include <QtWidgets/qfiledialog.h>
#include "ui_GuiLight.h"

typedef struct tagRGBImg
{
	unsigned char*       pucImg[3];
	unsigned int         sImgWidth;
	unsigned int         sImgHeight;
	unsigned int         sImgStride;
}RGB_IMG_S;

typedef struct tagTImgBox
{
	int				  lastState;
	unsigned int      imgNum;
	RGB_IMG_S         img[100];
}T_IMG_BOX_S;

typedef struct tagTTImgBox
{
	unsigned int      TBoxNum;
	T_IMG_BOX_S       TBox[100];
}TT_IMG_BOX_S;

class GuiLight;
class MyThread :public QThread
{
	Q_OBJECT
public:
	MyThread(QObject* parent, GuiLight* gui);
	~MyThread();

	void stop();
	void run();//线程入口函数(工作线程的主函数)

private:
	GuiLight* m_gui;
	RGB_IMG_S m_rgb[4];
	TT_IMG_BOX_S m_TTBox[4];
	QImage* m_showimage[4];
	int     m_stop;
};

class GuiLight : public QMainWindow
{
	Q_OBJECT

public:
	GuiLight(QWidget* parent = Q_NULLPTR);
	~GuiLight();
	
	int getimgNum() { return m_imgNum; };
	int getLabelSize() { return m_labelSize; };

protected:
	//关闭按钮触发
	void closeEvent(QCloseEvent* event);

signals:
    void sigtopLabelShowImg(QImage*);
	void sigbottomLabelShowImg(QImage*);
	void sigleftLabelShowImg(QImage*);
	void sigrightLabelShowImg(QImage*);
    
private slots:
	void topLabelShowImg(QImage* img);
	void bottomLabelShowImg(QImage* img);
	void leftLabelShowImg(QImage* img);
	void rightLabelShowImg(QImage* img);

private:
	int m_imgNum;
	int m_labelSize;
	QLabel* m_topLabel;
	QLabel* m_bottomLabel;
	QLabel* m_leftLabel;
	QLabel* m_rightLabel;
	MyThread* m_task;

	Ui::GuiLightClass ui;
};

GuiLight.cpp

#include "GuiLight.h"

static int g_labelSize = 4;//小图的宽度,g_labelSize:4字节对齐
static int g_imgNum = 8;//颜色条宽度,每个颜色条有几个小图
static int g_TboxNum = 4;//每个label颜色条个数
static int g_sleepms = 1000;//多久动一次

void setImg(RGB_IMG_S* img, int r, int g, int b)
{
	if (img == NULL)
		return;
	for (unsigned int i = 0; i < img->sImgHeight; i++)
	{
		for (unsigned int j = 0; j < img->sImgWidth; j++)
		{
			*(img->pucImg[0] + (i * img->sImgStride + j) * 3) = r;
			*(img->pucImg[1] + (i * img->sImgStride + j) * 3) = g;
			*(img->pucImg[2] + (i * img->sImgStride + j) * 3) = b;
		}
	}
}

MyThread::MyThread(QObject* parent, GuiLight* gui)
	:QThread(parent)
{
	m_gui = NULL;
	memset(&m_rgb[0], 0, sizeof(RGB_IMG_S)*4);
	memset(&m_TTBox[0], 0, sizeof(TT_IMG_BOX_S)*4);
	m_showimage[0] = NULL;
	m_showimage[1] = NULL;
	m_showimage[2] = NULL;
	m_showimage[3] = NULL;
	m_stop = 1;

	if (gui == NULL)
		return;

	m_gui = gui;

	int boxSize = gui->getLabelSize();
	int imgNum = m_gui->getimgNum();
	int lastStat = 0;

	m_rgb[0].sImgWidth = gui->width();
	m_rgb[0].sImgHeight = boxSize;
	m_rgb[0].sImgStride = gui->width();
	m_rgb[0].pucImg[0] = (unsigned char*)malloc(m_rgb[0].sImgStride * m_rgb[0].sImgHeight * 3);
	memset(m_rgb[0].pucImg[0], 0, m_rgb[0].sImgStride * m_rgb[0].sImgHeight * 3);
	m_rgb[0].pucImg[1] = m_rgb[0].pucImg[0] + 1;
	m_rgb[0].pucImg[2] = m_rgb[0].pucImg[1] + 1;

	m_TTBox[0].TBoxNum = m_rgb[0].sImgWidth / boxSize / imgNum;

    lastStat = 0;
	for (unsigned int i = 0; i < m_TTBox[0].TBoxNum; i++)
	{
		lastStat++;
		m_TTBox[0].TBox[i].imgNum = imgNum;
		for (unsigned int j = 0; j < m_TTBox[0].TBox[i].imgNum; j++)
		{
			if (lastStat % 2)
				m_TTBox[0].TBox[i].lastState = 1;
			else
				m_TTBox[0].TBox[i].lastState = 0;

			m_TTBox[0].TBox[i].img[j].pucImg[0] = m_rgb[0].pucImg[0] + (i * imgNum + j) * boxSize * 3;
			m_TTBox[0].TBox[i].img[j].pucImg[1] = m_TTBox[0].TBox[i].img[j].pucImg[0] + 1;
			m_TTBox[0].TBox[i].img[j].pucImg[2] = m_TTBox[0].TBox[i].img[j].pucImg[1] + 1;
			m_TTBox[0].TBox[i].img[j].sImgWidth = boxSize;
			m_TTBox[0].TBox[i].img[j].sImgHeight = boxSize;
			m_TTBox[0].TBox[i].img[j].sImgStride = m_rgb[0].sImgStride;

			if (m_TTBox[0].TBox[i].lastState)
			{
				setImg(&m_TTBox[0].TBox[i].img[j], 255, 0, 0);
			}
		}
	}

	m_showimage[0] = new QImage((uchar*)m_rgb[0].pucImg[0], gui->width(), boxSize, QImage::Format_RGB888);
	emit m_gui->sigtopLabelShowImg(m_showimage[0]);

	m_rgb[1].sImgWidth = gui->width();
	m_rgb[1].sImgHeight = boxSize;
	m_rgb[1].sImgStride = gui->width();
	m_rgb[1].pucImg[0] = (unsigned char*)malloc(m_rgb[1].sImgStride * m_rgb[1].sImgHeight * 3);
	memset(m_rgb[1].pucImg[0], 0, m_rgb[1].sImgStride * m_rgb[1].sImgHeight * 3);
	m_rgb[1].pucImg[1] = m_rgb[1].pucImg[0] + 1;
	m_rgb[1].pucImg[2] = m_rgb[1].pucImg[1] + 1;

	m_TTBox[1].TBoxNum = m_rgb[1].sImgWidth / boxSize / imgNum;

	lastStat = 1;
	for (unsigned int i = 0; i < m_TTBox[1].TBoxNum; i++)
	{
		lastStat++;
		m_TTBox[1].TBox[i].imgNum = imgNum;
		for (unsigned int j = 0; j < m_TTBox[1].TBox[i].imgNum; j++)
		{
			if (lastStat % 2)
				m_TTBox[1].TBox[i].lastState = 1;
			else
				m_TTBox[1].TBox[i].lastState = 0;

			m_TTBox[1].TBox[i].img[j].pucImg[0] = m_rgb[1].pucImg[0] + (i * imgNum + j) * boxSize * 3;
			m_TTBox[1].TBox[i].img[j].pucImg[1] = m_TTBox[1].TBox[i].img[j].pucImg[0] + 1;
			m_TTBox[1].TBox[i].img[j].pucImg[2] = m_TTBox[1].TBox[i].img[j].pucImg[1] + 1;
			m_TTBox[1].TBox[i].img[j].sImgWidth = boxSize;
			m_TTBox[1].TBox[i].img[j].sImgHeight = boxSize;
			m_TTBox[1].TBox[i].img[j].sImgStride = m_rgb[1].sImgStride;

			if (m_TTBox[1].TBox[i].lastState)
			{
				setImg(&m_TTBox[1].TBox[i].img[j], 255, 0, 0);
			}
		}
	}

	m_showimage[1] = new QImage((uchar*)m_rgb[1].pucImg[0], gui->width(), boxSize, QImage::Format_RGB888);
	emit m_gui->sigbottomLabelShowImg(m_showimage[1]);

	m_rgb[2].sImgWidth = boxSize;
	m_rgb[2].sImgHeight = imgNum * boxSize * g_TboxNum;
	m_rgb[2].sImgStride = boxSize;
	m_rgb[2].pucImg[0] = (unsigned char*)malloc(m_rgb[2].sImgStride * m_rgb[2].sImgHeight * 3);
	memset(m_rgb[2].pucImg[0], 0, m_rgb[2].sImgStride * m_rgb[2].sImgHeight * 3);
	m_rgb[2].pucImg[1] = m_rgb[2].pucImg[0] + 1;
	m_rgb[2].pucImg[2] = m_rgb[2].pucImg[1] + 1;

	m_TTBox[2].TBoxNum = m_rgb[2].sImgHeight / boxSize / imgNum;

	lastStat = 1;
	for (unsigned int i = 0; i < m_TTBox[2].TBoxNum; i++)
	{
		lastStat++;
		m_TTBox[2].TBox[i].imgNum = imgNum;
		for (unsigned int j = 0; j < m_TTBox[2].TBox[i].imgNum; j++)
		{
			if (lastStat % 2)
				m_TTBox[2].TBox[i].lastState = 1;
			else
				m_TTBox[2].TBox[i].lastState = 0;

			m_TTBox[2].TBox[i].img[j].pucImg[0] = m_rgb[2].pucImg[0] + (i * imgNum + j) * boxSize * boxSize * 3;
			m_TTBox[2].TBox[i].img[j].pucImg[1] = m_TTBox[2].TBox[i].img[j].pucImg[0] + 1;
			m_TTBox[2].TBox[i].img[j].pucImg[2] = m_TTBox[2].TBox[i].img[j].pucImg[1] + 1;
			m_TTBox[2].TBox[i].img[j].sImgWidth = boxSize;
			m_TTBox[2].TBox[i].img[j].sImgHeight = boxSize;
			m_TTBox[2].TBox[i].img[j].sImgStride = m_rgb[2].sImgStride;

			if (m_TTBox[2].TBox[i].lastState)
			{
				setImg(&m_TTBox[2].TBox[i].img[j], 255, 0, 0);
			}
		}
	}

	m_showimage[2] = new QImage((uchar*)m_rgb[2].pucImg[0], boxSize, imgNum * boxSize * g_TboxNum, QImage::Format_RGB888);
	emit m_gui->sigleftLabelShowImg(m_showimage[2]);

	m_rgb[3].sImgWidth = boxSize;
	m_rgb[3].sImgHeight = imgNum * boxSize * g_TboxNum;
	m_rgb[3].sImgStride = boxSize;
	m_rgb[3].pucImg[0] = (unsigned char*)malloc(m_rgb[3].sImgStride * m_rgb[3].sImgHeight * 3);
	memset(m_rgb[3].pucImg[0], 0, m_rgb[3].sImgStride * m_rgb[3].sImgHeight * 3);
	m_rgb[3].pucImg[1] = m_rgb[3].pucImg[0] + 1;
	m_rgb[3].pucImg[2] = m_rgb[3].pucImg[1] + 1;

	m_TTBox[3].TBoxNum = m_rgb[3].sImgHeight / boxSize / imgNum;

	lastStat = 0;
	for (unsigned int i = 0; i < m_TTBox[3].TBoxNum; i++)
	{
		lastStat++;
		m_TTBox[3].TBox[i].imgNum = imgNum;
		for (unsigned int j = 0; j < m_TTBox[3].TBox[i].imgNum; j++)
		{
			if (lastStat % 2)
				m_TTBox[3].TBox[i].lastState = 1;
			else
				m_TTBox[3].TBox[i].lastState = 0;

			m_TTBox[3].TBox[i].img[j].pucImg[0] = m_rgb[3].pucImg[0] + (i * imgNum + j) * boxSize * boxSize * 3;
			m_TTBox[3].TBox[i].img[j].pucImg[1] = m_TTBox[3].TBox[i].img[j].pucImg[0] + 1;
			m_TTBox[3].TBox[i].img[j].pucImg[2] = m_TTBox[3].TBox[i].img[j].pucImg[1] + 1;
			m_TTBox[3].TBox[i].img[j].sImgWidth = boxSize;
			m_TTBox[3].TBox[i].img[j].sImgHeight = boxSize;
			m_TTBox[3].TBox[i].img[j].sImgStride = m_rgb[3].sImgStride;

			if (m_TTBox[3].TBox[i].lastState)
			{
				setImg(&m_TTBox[3].TBox[i].img[j], 255, 0, 0);
			}
		}
	}

	m_showimage[3] = new QImage((uchar*)m_rgb[3].pucImg[0], boxSize, imgNum * boxSize * g_TboxNum, QImage::Format_RGB888);
	emit m_gui->sigrightLabelShowImg(m_showimage[3]);

    m_stop = 0;
	start();
}

MyThread::~MyThread()
{
    delete m_showimage[0];
    delete m_showimage[1];
    delete m_showimage[2];
    delete m_showimage[3];
}

void MyThread::stop()
{
	m_stop = 1;
}

void MyThread::run()
{
	unsigned int cnt = 0;
    int ix = g_imgNum - 1;
    srand((unsigned)time(NULL));
    int tr = rand() % 255;
    int tg = rand() % 255;
    int tb = rand() % 255;
	while (1)
	{
        if(cnt%(g_imgNum*g_TboxNum*4) == 0)
        {
            tr = rand() % 255;
            tg = rand() % 255;
            tb = rand() % 255;
        }
		for (unsigned int i = 0; i < m_TTBox[0].TBoxNum; i++)
		{
			if ((cnt / g_imgNum != 0) && (cnt % g_imgNum == 0))
				m_TTBox[0].TBox[i].lastState = !m_TTBox[0].TBox[i].lastState;
			if (m_TTBox[0].TBox[i].lastState)
			{
				setImg(&m_TTBox[0].TBox[i].img[ix - cnt % g_imgNum], 0, 0, 0);
			}
			else
			{
				setImg(&m_TTBox[0].TBox[i].img[ix - cnt % g_imgNum], tr, tg, tb);
			}
		}
		for (unsigned int i = 0; i < m_TTBox[1].TBoxNum; i++)
		{
			if ((cnt / g_imgNum != 0) && (cnt % g_imgNum == 0))
				m_TTBox[1].TBox[i].lastState = !m_TTBox[1].TBox[i].lastState;
			if (m_TTBox[1].TBox[i].lastState)
			{
				setImg(&m_TTBox[1].TBox[i].img[cnt % g_imgNum], 0, 0, 0);
			}
			else
			{
				setImg(&m_TTBox[1].TBox[i].img[cnt % g_imgNum], tr, tg, tb);
			}
		}
		for (unsigned int i = 0; i < m_TTBox[2].TBoxNum; i++)
		{
			if ((cnt / g_imgNum != 0) && (cnt % g_imgNum == 0))
				m_TTBox[2].TBox[i].lastState = !m_TTBox[2].TBox[i].lastState;
			if (m_TTBox[2].TBox[i].lastState)
			{
				setImg(&m_TTBox[2].TBox[i].img[cnt % g_imgNum], 0, 0, 0);
			}
			else
			{
				setImg(&m_TTBox[2].TBox[i].img[cnt % g_imgNum], tr, tg, tb);
			}
		}
		for (unsigned int i = 0; i < m_TTBox[3].TBoxNum; i++)
		{
			if ((cnt / g_imgNum != 0) && (cnt % g_imgNum == 0))
				m_TTBox[3].TBox[i].lastState = !m_TTBox[3].TBox[i].lastState;
			if (m_TTBox[3].TBox[i].lastState)
			{
				setImg(&m_TTBox[3].TBox[i].img[ix - cnt % g_imgNum], 0, 0, 0);
			}
			else
			{
				setImg(&m_TTBox[3].TBox[i].img[ix - cnt % g_imgNum], tr, tg, tb);
			}
		}
		QThread::msleep(g_sleepms);
        emit m_gui->sigtopLabelShowImg(m_showimage[0]);
		emit m_gui->sigbottomLabelShowImg(m_showimage[1]);
		emit m_gui->sigleftLabelShowImg(m_showimage[2]);
		emit m_gui->sigrightLabelShowImg(m_showimage[3]);
		cnt++;
		if (m_stop == 1)
		{
			break;
		}
	}
}

GuiLight::GuiLight(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	//去掉最大化、最小化按钮,保留关闭按钮
    this->setWindowFlags(Qt::WindowCloseButtonHint);

	m_imgNum = g_imgNum;
	m_labelSize = g_labelSize;
	int TboxNum = g_TboxNum;
	this->resize(m_imgNum * m_labelSize * TboxNum, m_imgNum * m_labelSize * TboxNum + 2 * m_labelSize);
	
	//窗体位置
	this->move(((QApplication::desktop()->width() - this->width()) / 2), (QApplication::desktop()->height() - this->height()) / 2);

	m_topLabel = new QLabel(ui.centralWidget);
	m_topLabel->setObjectName(QString::fromUtf8("label"));
	m_topLabel->setGeometry(QRect(0, 0, this->width(), m_labelSize));

    m_bottomLabel = new QLabel(ui.centralWidget);
	m_bottomLabel->setObjectName(QString::fromUtf8("label"));
	m_bottomLabel->setGeometry(QRect(0, m_imgNum * m_labelSize * TboxNum + m_labelSize, this->width(), m_labelSize));

    m_leftLabel = new QLabel(ui.centralWidget);
	m_leftLabel->setObjectName(QString::fromUtf8("label"));
	m_leftLabel->setGeometry(QRect(0, m_labelSize, m_labelSize, m_imgNum * m_labelSize * TboxNum));

    m_rightLabel = new QLabel(ui.centralWidget);
	m_rightLabel->setObjectName(QString::fromUtf8("label"));
	m_rightLabel->setGeometry(QRect(this->width() - m_labelSize, m_labelSize, m_labelSize, m_imgNum * m_labelSize * TboxNum));

    connect(this, SIGNAL(sigtopLabelShowImg(QImage*)), this, SLOT(topLabelShowImg(QImage*)));
    connect(this, SIGNAL(sigbottomLabelShowImg(QImage*)), this, SLOT(bottomLabelShowImg(QImage*)));
    connect(this, SIGNAL(sigleftLabelShowImg(QImage*)), this, SLOT(leftLabelShowImg(QImage*)));
    connect(this, SIGNAL(sigrightLabelShowImg(QImage*)), this, SLOT(rightLabelShowImg(QImage*)));

	m_task = new MyThread(NULL, this);
}

GuiLight::~GuiLight()
{
	if (m_task != NULL)
	{
		delete m_task;
	}
	if(m_topLabel != NULL)
		delete m_topLabel;
	if(m_bottomLabel != NULL)
		delete m_bottomLabel;
	if(m_leftLabel != NULL)
		delete m_leftLabel;
	if(m_rightLabel != NULL)
		delete m_rightLabel;
}

void GuiLight::topLabelShowImg(QImage* img)
{ 
	if(m_topLabel != NULL)
		m_topLabel->setPixmap(QPixmap::fromImage(*img));
}

void GuiLight::bottomLabelShowImg(QImage* img)
{ 
	if(m_bottomLabel != NULL)
		m_bottomLabel->setPixmap(QPixmap::fromImage(*img));
}

void GuiLight::leftLabelShowImg(QImage* img)
{ 
	if(m_leftLabel != NULL)
		m_leftLabel->setPixmap(QPixmap::fromImage(*img));
}

void GuiLight::rightLabelShowImg(QImage* img)
{ 
	if(m_rightLabel != NULL)
		m_rightLabel->setPixmap(QPixmap::fromImage(*img));
}

void GuiLight::closeEvent(QCloseEvent* event)
{
	if (1)
	{
		m_task->stop();
		QThread::msleep(g_sleepms*1.2);

		event->accept();
	}
	else
	{
		event->ignore();
	}
}

GuiLight.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>GuiLightClass</class>
 <widget class="QMainWindow" name="GuiLightClass">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>500</width>
    <height>400</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>GuiLight</string>
  </property>
  <widget class="QWidget" name="centralWidget"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

4、直接下载exe看效果:
链接:https://pan.baidu.com/s/1VzYYUNQhpAFSR7u0UN7gzA
提取码:uc38
5、编译代码:
参考:vs2019开发qt项目环境搭建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值