双向循环列表
#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
使用案列
#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
#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()
{
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->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() {
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);
}