唔,准备爬一个网站,顺便做个切换目录的按钮
- 可以左右和上下滚动
- 当前按钮禁止点击
- 点击时发送连接消息
- 只有水平或垂直对齐方式
#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);
int getCurrentIndex();
void setUrl(const QStringList &url);
void addUrl(const QString &url);
QList<QPushButton*> getButtons();
signals:
void clicked(const QString url);
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;
QStringList m_Urls;
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::setUrl(const QStringList &url)
{
const int length = url.length();
for(int i=0;i<length;i++){
addUrl(url[i]);
}
}
void MenuDirectory::addUrl(const QString &url)
{
m_Urls << url;
int index = m_Urls.length()-1;
QPushButton *tmp=new QPushButton(QString::number(index),this);
m_Buttons << tmp;
tmp->resize(m_Size, m_Size);
if(m_Alignment == Qt::AlignHCenter)
tmp->move((m_Size+m_Interval)*index, m_ButtonY);
else
tmp->move(m_ButtonX, (m_Size+m_Interval)*index);
connect(tmp, &QPushButton::clicked, this, [=,index](){
currentIndexChange(index);
emit clicked(m_Urls[index]);
});
if(m_Index == -1 && m_Urls.length()){
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_Urls.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;
m_Urls.clear();
int length = m_Buttons.length();
for(int i=0;i<length;i++){
m_Buttons[i]->deleteLater();
}
m_Buttons.clear();
}