diff --git a/common-plugin/networkdialog/networkpanel.cpp b/common-plugin/networkdialog/networkpanel.cpp index 33a5243c..80de389f 100644 --- a/common-plugin/networkdialog/networkpanel.cpp +++ b/common-plugin/networkdialog/networkpanel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -111,6 +111,7 @@ void NetworkPanel::initUi() m_netListView->setMouseTracking(true); m_netListView->setItemMargins(QMargins(10, 0, 10, 0)); m_netListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + m_netListView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); m_netListView->setItemRadius(0); NetworkDelegate *delegate = new NetworkDelegate(m_netListView); @@ -163,11 +164,8 @@ void NetworkPanel::initUi() setControlBackground(); // 支持在触摸屏上滚动 - QScroller::grabGesture(m_netListView->viewport(), QScroller::LeftMouseButtonGesture); - QScroller *scroller = QScroller::scroller(m_netListView->window()); - QScrollerProperties sp; - sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(sp); + m_netListView->setAttribute(Qt::WA_AcceptTouchEvents, true); + m_netListView->viewport()->setAttribute(Qt::WA_AcceptTouchEvents, true); } void NetworkPanel::initConnection() diff --git a/net-view/window/netview.cpp b/net-view/window/netview.cpp index 8438f38e..b63f1bbe 100644 --- a/net-view/window/netview.cpp +++ b/net-view/window/netview.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -66,6 +67,8 @@ NetView::NetView(NetManager *manager) setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); setSelectionMode(QAbstractItemView::NoSelection); setRootIsDecorated(false); @@ -83,13 +86,8 @@ NetView::NetView(NetManager *manager) connect(this, &NetView::activated, this, &NetView::onActivated); // 支持在触摸屏上滚动 - QScroller::grabGesture(viewport(), QScroller::TouchGesture); - QScrollerProperties sp = QScroller::scroller(viewport())->scrollerProperties(); - sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - sp.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.5); - sp.setScrollMetric(QScrollerProperties::MaximumVelocity, 0.5); - QScroller::scroller(viewport())->setScrollerProperties(sp); + setAttribute(Qt::WA_AcceptTouchEvents, true); + viewport()->setAttribute(Qt::WA_AcceptTouchEvents, true); } NetView::~NetView() = default; @@ -183,6 +181,74 @@ void NetView::rowsInserted(const QModelIndex &parent, int start, int end) bool NetView::viewportEvent(QEvent *event) { + const QEvent::Type type = event->type(); + if (type == QEvent::TouchBegin || type == QEvent::TouchUpdate || + type == QEvent::TouchEnd || type == QEvent::TouchCancel) { + + QTouchEvent *te = static_cast(event); + if (te->points().isEmpty()) { + event->accept(); + return true; + } + + QEventPoint pt = te->points().first(); + + switch (type) { + case QEvent::TouchBegin: { + m_touchPressPos = pt.globalPosition(); + m_isDrag = false; + break; + } + case QEvent::TouchUpdate: { + QPointF delta = pt.globalPosition() - m_touchPressPos; + + if (!m_isDrag && (qAbs(delta.y()) >= QApplication::startDragDistance() || qAbs(delta.x()) >= QApplication::startDragDistance())) { + m_isDrag = true; + } + + if (m_isDrag) { + if (qAbs(delta.y()) > 0 && verticalScrollBar()) { + verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y()); + } + if (qAbs(delta.x()) > 0 && horizontalScrollBar()) { + horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x()); + } + m_touchPressPos = pt.globalPosition(); + } + break; + } + case QEvent::TouchEnd: { + if (!m_isDrag) { + // Determine the correct target widget for the click + QWidget *target = viewport(); + QPoint widgetPos = pt.position().toPoint(); + + if (QWidget *child = target->childAt(widgetPos)) { + target = child; + if (target) { + widgetPos = target->mapFrom(viewport(), widgetPos); + } + } + + QMouseEvent press(QEvent::MouseButtonPress, widgetPos, pt.globalPosition(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QCoreApplication::sendEvent(target, &press); + QMouseEvent release(QEvent::MouseButtonRelease, widgetPos, pt.globalPosition(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); + QCoreApplication::sendEvent(target, &release); + } + break; + } + case QEvent::TouchCancel: { + m_isDrag = false; + break; + } + default: + break; + } + + event->accept(); + return true; + } + switch (event->type()) { case QEvent::HoverLeave: { setCurrentIndex(QModelIndex()); diff --git a/net-view/window/netview.h b/net-view/window/netview.h index 3962d2ff..e63155e4 100644 --- a/net-view/window/netview.h +++ b/net-view/window/netview.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef NETVIEW_H @@ -74,6 +74,8 @@ protected Q_SLOTS: NetDelegate *m_delegate; bool m_closeOnClear; int m_maxHeight; + QPointF m_touchPressPos; + bool m_isDrag = false; }; } // namespace network