想了下上一个版本承担的责任有点多不利于复用,所以优化了下
#ifndef MENUDIRECTORY_H
#define MENUDIRECTORY_H
#include <QWidget>
class QUrl;
class QPushButton;
class MenuDirectory : public QWidget
{
Q_OBJECT
public:
explicit MenuDirectory(QWidget *parent = nullptr);
MenuDirectory(int speed, int size, int interval, Qt::AlignmentFlag aligment=Qt::AlignHCenter,QWidget *parent = nullptr);
void initMenuDirectory(int speed, int size, int interval);
void setAlignment(Qt::AlignmentFlag aligment);
void setButtonNumber(int number);
int getCurrentIndex();
QList<QPushButton*> getButtons();
signals:
void clicked(int index);
public slots:
void currentIndexChange(int index);
void DetObject();
protected:
bool eventFilter(QObject *watched, QEvent *event);
void resizeEvent(QResizeEvent *event);
void closeEvent(QCloseEvent *event);
private:
void CalculationX();
void CalculationY();
void scrollUp();
void scrollDown();
private:
int m_Size;
int m_Index;
int m_Speed;
int m_ButtonX;
int m_ButtonY;
int m_Interval;
QWidget *m_Parent;
Qt::AlignmentFlag m_Alignment;
QList<QPushButton*> m_Buttons;
};
#endif // MENUDIRECTORY_H
#include "menudirectory.h"
#include <QWheelEvent>
#include <QPushButton>
MenuDirectory::MenuDirectory(QWidget *parent) : QWidget(parent)
{
m_Speed = 0;
m_Size = 0;
m_Index = -1;
m_Alignment = Qt::AlignHCenter;
m_Parent = parent;
m_Parent->installEventFilter(this);
}
MenuDirectory::MenuDirectory(int speed, int size, int interval, Qt::AlignmentFlag aligment, QWidget *parent)
: QWidget(parent)
{
m_Index = -1;
m_Size = size;
m_Speed = speed;
m_Interval = interval;
m_Alignment = aligment;
m_Parent = parent;
m_Parent->installEventFilter(this);
}
int MenuDirectory::getCurrentIndex()
{
return m_Index;
}
void MenuDirectory::initMenuDirectory(int speed, int size, int interval)
{
m_Speed = speed;
m_Size = size;
m_Interval = interval;
if(m_Alignment == Qt::AlignHCenter)
CalculationY();
else
CalculationX();
}
void MenuDirectory::setAlignment(Qt::AlignmentFlag aligment)
{
m_Alignment = aligment;
}
void MenuDirectory::setButtonNumber(int number)
{
if(!number)
return;
int iTemp;
const int interval = m_Size + m_Interval;
for(int i=0;i<number;i++){
QPushButton *tmp = new QPushButton(QString::number(i),this);
m_Buttons << tmp;
tmp->resize(m_Size, m_Size);
iTemp = interval * i;
if(m_Alignment == Qt::AlignHCenter)
tmp->move(iTemp, m_ButtonY);
else
tmp->move(m_ButtonX, iTemp);
connect(tmp, &QPushButton::clicked, this, [=,i](){
currentIndexChange(i);
emit clicked(i);
});
}
currentIndexChange(0);
}
QList<QPushButton *> MenuDirectory::getButtons()
{
return m_Buttons;
}
void MenuDirectory::currentIndexChange(int index)
{
if(getCurrentIndex() != -1)
m_Buttons[getCurrentIndex()]->setEnabled(true);
m_Index = index;
if(m_Buttons[index]->isEnabled())
m_Buttons[index]->setEnabled(false);
}
bool MenuDirectory::eventFilter(QObject *watched, QEvent *event)
{
if(m_Parent){
if(watched == m_Parent){
if(event->type() == QEvent::Wheel){
QWheelEvent *whell = static_cast<QWheelEvent*>(event);
if (whell->delta() > 0)
scrollUp();
else
scrollDown();
return true;
}
}
}
return false;
}
void MenuDirectory::resizeEvent(QResizeEvent *)
{
if(m_Alignment == Qt::AlignHCenter)
CalculationY();
else
CalculationX();
}
void MenuDirectory::closeEvent(QCloseEvent *)
{
DetObject();
}
void MenuDirectory::CalculationX()
{
m_ButtonX = (width() - m_Size ) / 2;
}
void MenuDirectory::CalculationY()
{
m_ButtonY = (height() - m_Size ) / 2;
}
void MenuDirectory::scrollUp()
{
if(m_Alignment == Qt::AlignHCenter){
if(this->x() >= 0)
this->move(0,this->y());
else
this->move(this->x() + m_Speed,this->y());
}else{
if(this->y() >= 0)
this->move(0,this->y());
else
this->move(this->x(),this->y() + m_Speed);
}
}
void MenuDirectory::scrollDown()
{
int pos = -(m_Buttons.length()-1)*(m_Size+m_Interval);;
if(m_Alignment == Qt::AlignHCenter){
if(this->x() <= pos)
this->move(pos,this->y());
else
this->move(this->x() - m_Speed,this->y());
}else{
if(this->y() <= pos)
this->move(this->x(),pos);
else
this->move(this->x(),this->y() - m_Speed);
}
}
void MenuDirectory::DetObject()
{
m_Index = -1;
int length = m_Buttons.length();
for(int i=0;i<length;i++){
m_Buttons[i]->deleteLater();
}
m_Buttons.clear();
}