#include "qnavigationwidget.h" #include #include QNavigationWidget::QNavigationWidget(QWidget *parent) : QWidget(parent) { backgroundColor = "#E4E4E4"; selectedColor = "#2CA7F8"; rowHeight = 40; currentIndex = 0; MouseColor = "#87CEFF"; MouseIndex = -1; controlBarColor = "#CAE1FF"; controlSlideColor = "#1E90FF"; controlBarWidth = 10; setAttribute(Qt::WA_AlwaysStackOnTop); setWindowFlags(Qt::WindowStaysOnTopHint); setMouseTracking(true); setFixedWidth(150); } QNavigationWidget::~QNavigationWidget() { } void QNavigationWidget::addItem(const QString &title, QIcon &icon) { Q_UNUSED(icon); listItems << title; update(); } void QNavigationWidget::setWidth(const int &width) { setFixedWidth(width); } void QNavigationWidget::setBackgroundColor(const QString &color) { backgroundColor = color; update(); } void QNavigationWidget::setSelectColor(const QString &color) { selectedColor = color; update(); } void QNavigationWidget::setRowHeight(const int &height) { rowHeight = height; update(); } void QNavigationWidget::setCurrentIndex(const int &index) { currentIndex = index; update(); } int QNavigationWidget::Index(void) { return currentIndex; } void QNavigationWidget::resizeEvent(QResizeEvent *event) { emit SizeChanged(event); } void QNavigationWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); // Draw background color. painter.setPen(Qt::NoPen); painter.setBrush(QColor(backgroundColor)); painter.drawRect(rect()); if(!isHidden) { QPainterPath MenuPath; MenuPath.addRect(QRect(width() - controlBarWidth,0,controlBarWidth, height())); painter.setPen("#202020"); painter.fillPath(MenuPath, QColor(controlBarColor)); int h = height()/2; QPolygon polygon1,polygon2,polygon3,polygon4; polygon1.setPoints(4, width() - controlBarWidth,h , width(), h - controlBarWidth, width(), h - 3 * controlBarWidth / 2, width() - controlBarWidth,h - controlBarWidth / 2); polygon2.setPoints(4, width() - controlBarWidth,h , width(), h + controlBarWidth, width(), h + 3 * controlBarWidth / 2, width() - controlBarWidth,h + controlBarWidth / 2); polygon3.setPoints(4, width() - controlBarWidth,h - controlBarWidth , width(), h - 2 * controlBarWidth, width(), h - 5 * controlBarWidth /2, width() - controlBarWidth,h - 3 * controlBarWidth /2); polygon4.setPoints(4, width() - controlBarWidth,h + controlBarWidth , width(), h + 2 * controlBarWidth, width(), h + 5 * controlBarWidth /2, width() - controlBarWidth,h + 3 * controlBarWidth /2); QPainterPath SlidePath; SlidePath.addRegion(polygon1); SlidePath.addRegion(polygon2); SlidePath.addRegion(polygon3); SlidePath.addRegion(polygon4); painter.fillPath(SlidePath, QColor(controlSlideColor)); // Draw Items int count = 0; for (const QString &str : listItems) { QPainterPath itemPath; itemPath.addRect(QRect(0, count * rowHeight, width() - controlBarWidth, rowHeight)); if (currentIndex == count) { painter.setPen("#FFFFFF"); painter.fillPath(itemPath, QColor(selectedColor)); }else { painter.setPen("#202020"); if(MouseIndex == count) { painter.fillPath(itemPath, QColor(MouseColor)); } else { painter.fillPath(itemPath, QColor(backgroundColor)); } } painter.drawText(QRect(0, count * rowHeight, width(), rowHeight), Qt::AlignVCenter | Qt::AlignHCenter, str); ++count; } //DrawHandle } else//隐藏状态 { QPainterPath MenuPath; MenuPath.addRect(QRect(0,0,controlBarWidth, height())); painter.setPen("#202020"); painter.fillPath(MenuPath, QColor(controlBarColor)); int h = height()/2; QPolygon polygon1,polygon2,polygon3,polygon4; polygon1.setPoints(4, controlBarWidth,h , 0, h - controlBarWidth, 0, h - 3 * controlBarWidth / 2, controlBarWidth,h - controlBarWidth / 2); polygon2.setPoints(4, controlBarWidth,h , 0, h + controlBarWidth, 0, h + 3 * controlBarWidth / 2, controlBarWidth,h + controlBarWidth / 2); polygon3.setPoints(4, controlBarWidth,h - controlBarWidth , 0, h - 2 * controlBarWidth, 0, h - 5 * controlBarWidth /2, controlBarWidth,h - 3 * controlBarWidth /2); polygon4.setPoints(4, controlBarWidth,h + controlBarWidth , 0, h + 2 * controlBarWidth, 0, h + 5 * controlBarWidth /2, controlBarWidth,h + 3 * controlBarWidth /2); QPainterPath SlidePath; SlidePath.addRegion(polygon1); SlidePath.addRegion(polygon2); SlidePath.addRegion(polygon3); SlidePath.addRegion(polygon4); painter.fillPath(SlidePath, QColor(controlSlideColor)); } } void QNavigationWidget::mouseMoveEvent(QMouseEvent *e) { if ((e->y() / rowHeight < listItems.count())&& (e->x() < (width() - controlBarWidth))) { MouseIndex = e->y() / rowHeight; update(); } else { MouseIndex = -1; update(); } } void QNavigationWidget::enterEvent(QEvent *e) { qDebug() << e; } void QNavigationWidget::leaveEvent(QEvent *e) { Q_UNUSED(e); MouseIndex = -1; update(); } void QNavigationWidget::mousePressEvent(QMouseEvent *e) { if ((e->y() / rowHeight < listItems.count())&& (e->x() < (width() - controlBarWidth))) { currentIndex = e->y() / rowHeight; emit ItemChanged(currentIndex); update(); } else if((e->x() > (width() - controlBarWidth)) && (e->x() < width()) ) { isHidden = isHidden?false:true; //qDebug() << isHidden; if(isHidden){ setWidth(controlBarWidth); } else { setWidth(150); } update(); } } void QNavigationWidget::mouseReleaseEvent(QMouseEvent *e) { }