#include "IrregularButton.h" #include #include "MainWindow.h" #include "TownImageWidget.h" IrregularButton::IrregularButton(QWidget* parent /*= nullptr*/) : QPushButton(parent) { setObjectName("IrregularButton"); InitParentWidgetSlot(parent); //setAttribute(Qt::WA_TranslucentBackground); } IrregularButton::IrregularButton(const QString& text, QWidget* parent /*= nullptr*/) : QPushButton(text, parent) { setObjectName("IrregularButton"); InitParentWidgetSlot(parent); //setAttribute(Qt::WA_TranslucentBackground); } IrregularButton::IrregularButton(const QIcon& icon, const QString& text, QWidget* parent /*= nullptr*/) : QPushButton(icon, text, parent) { setObjectName("IrregularButton"); InitParentWidgetSlot(parent); //setAttribute(Qt::WA_TranslucentBackground); } void IrregularButton::OnEmitEnter() { auto dt = static_cast(m_detailedType); MediaInfo item; if (!MainWindow::Get().GetMediaInfo(dt, m_btnName, item)) { qDebug() << "not get item: " << dt << " or text: " << m_btnName; return; } int x = 0, y = 0; QRect rect = geometry(); if (item.start == 0) { x = rect.width() + rect.x(); y = rect.y() + rect.height() / 2; } else if (item.start == 1) { x = rect.x() + rect.width() / 2; y = rect.y(); // +rect.height() / 2; } else { x = rect.x(); y = rect.y() + rect.height() / 2; } QPointF end = GetEndPoint(item.end); emit Enter(QPointF(x, y), end); } // //void IrregularButton::enterEvent(QEnterEvent* event) { // QPushButton::enterEvent(event); // // auto dt = static_cast(m_detailedType); // MediaInfo item; // if (!MainWindow::Get().GetMediaInfo(dt, m_btnName, item)) { // qDebug() << "not get item: " << dt << " or text: " << m_btnName; // return; // } // // int x = 0, y = 0; // QRect rect = geometry(); // if (item.start == 0) { // x = rect.width() + rect.x(); // y = rect.y() + rect.height() / 2; // } // else if (item.start == 1) { // x = rect.x() + rect.width() / 2; // y = rect.y(); // +rect.height() / 2; // } // else { // x = rect.x(); // y = rect.y() + rect.height() / 2; // } // // QPointF end = GetEndPoint(item.end); // emit Enter(QPointF(x, y), end); //} // //void IrregularButton::leaveEvent(QEvent* event) { // QPushButton::leaveEvent(event); // emit Leave(); //} bool IrregularButton::event(QEvent* e) { switch (e->type()) { case QEvent::TouchBegin: { m_bTouchEnd = false; QMouseEvent mouseEvent(QEvent::MouseButtonPress, QPointF(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QCoreApplication::sendEvent(this, &mouseEvent); e->accept(); return true; } break; case QEvent::TouchEnd: { QMouseEvent mouseEvent(QEvent::MouseButtonRelease, QPointF(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QCoreApplication::sendEvent(this, &mouseEvent); m_bTouchEnd = true; e->accept(); return true; } break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: { if (m_bTouchEnd) { e->accept(); return true; } }break; default: break; } return QPushButton::event(e); } void IrregularButton::mousePressEvent(QMouseEvent* e) { QPushButton::mousePressEvent(e); OnEmitEnter(); update(); } void IrregularButton::mouseReleaseEvent(QMouseEvent* e) { emit Leave(); update(); QPushButton::mouseReleaseEvent(e); MainWindow::Get().PlayAudio(); } QPointF IrregularButton::GetEndPoint(const QPointF& target) { QRect rect = geometry(); const QRect& widgetRect = parentWidget()->geometry(); QPoint pt = widgetRect.topLeft(); QPointF ptf = target; auto minValue = [](float x) { return x > 0.0f ? x : 0.0f; }; return { minValue(ptf.x()), minValue(ptf.y()) }; } void IrregularButton::InitParentWidgetSlot(QWidget* parent) { TownImageWidget* imageWidget = dynamic_cast(parent); if (nullptr == imageWidget) { return; } connect(this, &IrregularButton::Enter, imageWidget, &TownImageWidget::OnBeginDraw); connect(this, &IrregularButton::Leave, imageWidget, &TownImageWidget::OnEndDraw); }