双向循环列表

11 篇文章 0 订阅

双向循环列表

#ifndef _DOUBLE_LINKED_LIST_HPP_
#define _DOUBLE_LINKED_LIST_HPP_
#include <QSharedPointer>
template<typename T>
struct Node {
	T data;
	int index = -1;
	Node* next = nullptr;
	Node* last = nullptr;
	Node(const T& data) {
		this->data = data;
	}
};

template<typename T>
class DoubleLinkedList {
public:
	void push_back(const T& data) {
		Node<T>* node = new Node<T>(data);
		m_nSize++;
		node->index = m_nSize;
		if (m_head == nullptr && m_tail == nullptr) {
			m_selected = m_tail = m_head = node;
			m_head->last = m_tail;
			m_head->next = node;

			return;
		}
		m_tail->next = node;
		node->last = m_tail;
		node->next = m_head;
		m_tail = node;
		m_head->last = m_tail;
	}
	int size()const {
		return m_nSize;
	}
	int currentIndex() const {
		return m_selected == nullptr ? 0 : m_selected->index;
	}
	T data()const {
		T data;
		return m_selected == nullptr ? data : m_selected->data;
	}
	T lastData()const {
		T data;
		return m_selected == nullptr ? data : m_selected->last->data;
	}
	T nextData()const {
		T data;
		return  m_selected == nullptr ? data : m_selected->next->data;
	}

	void last() {
		if (m_selected == nullptr) {
			return;
		}
		m_selected = m_selected->last;
	}

	void next() {
		if (m_selected == nullptr) {
			return;
		}
		m_selected = m_selected->next;
	}
	void clear() {
		Node<T>* ptr = m_head;
		while (ptr != m_tail)
		{
			if (ptr != nullptr) {
				delete ptr;
				ptr = nullptr;
			}
		}
		if (m_tail) {
			delete m_tail;
			m_tail = nullptr;
		}
		m_nSize = 0;
		m_head = nullptr;
		m_tail = nullptr;
		m_selected = nullptr;
	}

protected:
	Node<T>* m_head = nullptr;
	Node<T>* m_tail = nullptr;
	Node<T>* m_selected = nullptr;
	int m_nSize = 0;
};

#endif // !_DOUBLE_LINKED_LIST_HPP_

使用案列

#ifndef  _LIST_PLAYER_WIDGET_H_
#define  _LIST_PLAYER_WIDGET_H_
#include <QWidget>
#include "DoubleLinkedList.hpp"
#include <QString>
class QPushButton;
class QLabel;
class CButtonCtrl;
class Video {
public:
	Video(const QString& thumPath, const QString& videoPath);
	Video(const Video& video);
	Video();
	QString thumbPath()const;
	void setThumbPath(const QString& path);
	QString videoPath()const;
	void  setVideoPath(const QString& path);
	Video& operator=(const Video& video);
protected:
	QString m_thumbPath = "";
	QString m_videoPath = "";
};

class ListPlayerWidget :public QWidget
{
	Q_OBJECT
public:
	explicit ListPlayerWidget(QWidget* parent = nullptr);
	~ListPlayerWidget();
	void turnLeft();
	void turnRight();
	void push_back(const Video& video);

public slots:
	void slotPlayerBtnClicked();  
	void slotBackBtnClicked();  
	       
protected:
	void initDoubleList();
	void initUI();
	void initConnect();
	void UpdateData();
	virtual void paintEvent(QPaintEvent* event)override;
protected:
	QPushButton* m_backBtn = nullptr;
	QLabel* m_titleLbl = nullptr;
	QLabel* m_numberLbl = nullptr;
	QLabel* m_leftLbl = nullptr;
	QLabel* m_rightLbl = nullptr;
	QLabel* m_nameLbl = nullptr;
	CButtonCtrl* m_centerBtn = nullptr;
	DoubleLinkedList<Video> m_doubleList;
};

#endif // ! _LIST_PLAYER_WIDGET_H_

#include "ListPlayerWidget.h"
#include <QPaintEvent>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include "CButtonCtrl.h"
#include <QPainter>
#include <QFileInfo>
Video::Video(const QString& thumPath, const QString& videoPath)
	:m_thumbPath(thumPath), m_videoPath(videoPath)
{
}

Video::Video(const Video& other) : m_thumbPath(other.m_thumbPath), m_videoPath(other.m_videoPath)
{
}

Video::Video() : m_thumbPath(""), m_videoPath("")
{
}

QString Video::thumbPath() const
{
	return m_thumbPath;
}

void Video::setThumbPath(const QString& path)
{
	if (path == m_thumbPath)
	{
		return;
	}
	m_thumbPath = path;
}

QString Video::videoPath() const
{
	return m_videoPath;
}

void Video::setVideoPath(const QString& path)
{
	if (path == m_videoPath) {
		return;
	}
	m_videoPath = path;
}

Video& Video::operator=(const Video& video)
{
	m_thumbPath = video.m_thumbPath;
	m_videoPath = video.m_videoPath;
	return *this;
}

ListPlayerWidget::ListPlayerWidget(QWidget* parent) :QWidget(parent) {
	initUI();
	initConnect();
	initDoubleList();
}

ListPlayerWidget::~ListPlayerWidget()
{
}

void ListPlayerWidget::turnLeft()
{
	m_doubleList.last();
	UpdateData();
}

void ListPlayerWidget::turnRight()
{
	m_doubleList.next();
	UpdateData();
}

void ListPlayerWidget::push_back(const Video& video)
{
	m_doubleList.push_back(video);
	UpdateData();
}

void ListPlayerWidget::UpdateData()
{
	m_numberLbl->setText(QString("%1/%2").arg(m_doubleList.currentIndex()).arg(m_doubleList.size()));
	QPixmap pixmap(m_doubleList.lastData().thumbPath());
	m_leftLbl->setPixmap(pixmap.scaled(104, 108));
	pixmap.load(m_doubleList.nextData().thumbPath());
	m_rightLbl->setPixmap(pixmap.scaled(104, 108));
	m_centerBtn->setThumbPath(m_doubleList.data().thumbPath());
	QFileInfo file(m_doubleList.data().videoPath());
	if (file.exists()) {
		m_nameLbl->setText(file.baseName());
	}
}

void ListPlayerWidget::slotBackBtnClicked()
{
	turnRight();
}

void ListPlayerWidget::initDoubleList()
{
	//TODO

	UpdateData();
}

void ListPlayerWidget::initUI()
{
	setAttribute(Qt::WA_TranslucentBackground);
	setWindowFlags(Qt::FramelessWindowHint);
	m_backBtn = new QPushButton();
	m_backBtn->setObjectName("m_backBtn");
	m_backBtn->setFixedSize(QSize(72, 72));
	m_backBtn->setStyleSheet(QString("QPushButton{background-image:url(:/UiDataNode/image/backBtn.png);"));

	m_titleLbl = new QLabel();
	m_titleLbl->setObjectName("m_titleLbl");
	m_titleLbl->setAlignment(Qt::AlignHCenter | Qt::AlignRight);
	m_titleLbl->setText("PlayBack");
	m_titleLbl->setFixedHeight(24);
	m_numberLbl = new QLabel();
	m_numberLbl->setObjectName("m_numberLbl");
	m_numberLbl->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
	m_numberLbl->setFixedHeight(24);

	m_nameLbl = new QLabel();
	m_nameLbl->setObjectName("m_nameLbl");
	m_nameLbl->setText("Video Name");
	m_nameLbl->setFixedHeight(24);

	m_leftLbl = new QLabel(this);
	m_leftLbl->setObjectName("m_leftLbl");
	m_leftLbl->setFixedSize(144, 108);
	m_rightLbl = new QLabel(this);
	m_rightLbl->setObjectName("m_rightLbl");
	m_rightLbl->setFixedSize(144, 108);
	m_centerBtn = new CButtonCtrl(this);
	m_centerBtn->setObjectName("m_centerBtn");
	m_centerBtn->setFixedSize(224, 168);
	QVBoxLayout* layout = new QVBoxLayout();
	layout->setMargin(0);
	layout->addSpacerItem(new QSpacerItem(2, 54));
	QHBoxLayout* topLayout = new QHBoxLayout();
	topLayout->setMargin(0);
	topLayout->addSpacerItem(new QSpacerItem(68, 2));
	QVBoxLayout* vLayout1 = new QVBoxLayout();
	vLayout1->setMargin(0);
	vLayout1->addWidget(m_backBtn);
	vLayout1->addSpacerItem(new QSpacerItem(2, 15));

	topLayout->addLayout(vLayout1);

	QVBoxLayout* vLayout2 = new QVBoxLayout();
	vLayout2->setMargin(0);
	QHBoxLayout* hLayout1 = new QHBoxLayout();
	hLayout1->setMargin(0);
	hLayout1->addSpacerItem(new QSpacerItem(60, 2));
	hLayout1->addWidget(m_titleLbl);
	vLayout2->addLayout(hLayout1);

	QHBoxLayout* hLayout2 = new QHBoxLayout();
	hLayout2->setMargin(0);
	hLayout2->addSpacerItem(new QSpacerItem(60, 2));
	hLayout2->addWidget(m_numberLbl);

	vLayout2->addLayout(hLayout2);

	topLayout->addLayout(vLayout2);
	topLayout->addSpacerItem(new QSpacerItem(72, 2));
	layout->addLayout(topLayout);

	QHBoxLayout* hLayout3 = new QHBoxLayout();
	//hLayout3->addSpacerItem(new QSpacerItem(466, 168));
	//m_leftLbl->move(-31, 179);
	//m_centerBtn->move(121, 149);
	//m_rightLbl->move(353, 179);
	hLayout3->setMargin(0);
	hLayout3->addSpacerItem(new QSpacerItem(-31, 2));
	hLayout3->addWidget(m_leftLbl, 0, Qt::AlignVCenter | Qt::AlignRight);
	hLayout3->addSpacerItem(new QSpacerItem(8, 2));
	hLayout3->addWidget(m_centerBtn, 0, Qt::AlignCenter);
	hLayout3->addSpacerItem(new QSpacerItem(8, 2));
	hLayout3->addWidget(m_rightLbl, 0, Qt::AlignVCenter | Qt::AlignLeft);
	hLayout3->addSpacerItem(new QSpacerItem(-31, 2));
	layout->addLayout(hLayout3);
	QHBoxLayout* hLayout4 = new QHBoxLayout();
	hLayout4->addWidget(m_nameLbl, 0, Qt::AlignCenter);
	layout->addLayout(hLayout4);
	layout->addStretch();
	this->setLayout(layout);
}

void ListPlayerWidget::slotPlayerBtnClicked() {
	//TODO
	QString iPath = QString("C:/Users/gd09861-hlw/Desktop/UiDataNode/image/111/backImage%1.jpg").arg(m_doubleList.size());
	Video video(iPath, QString("%1").arg(m_doubleList.size()));
	push_back(video);
}

void ListPlayerWidget::initConnect()
{
	connect(m_backBtn, &QPushButton::clicked, this, &ListPlayerWidget::slotBackBtnClicked);
	connect(m_centerBtn, &CButtonCtrl::sglPlayerBtnClicked, this, &ListPlayerWidget::slotPlayerBtnClicked);
}

void ListPlayerWidget::paintEvent(QPaintEvent* event)
{
	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
	QPen brush(Qt::black);
	painter.setPen(brush);
	painter.drawEllipse(rect());
	QWidget::paintEvent(event);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值