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项目环境搭建