1515#include < QEvent>
1616#include < QHoverEvent>
1717#include < QScrollBar>
18+ #include < QCoreApplication>
1819#include < QScroller>
1920#include < QScrollerProperties>
2021#include < QSortFilterProxyModel>
@@ -66,6 +67,8 @@ NetView::NetView(NetManager *manager)
6667 setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
6768 setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded);
6869 setSizeAdjustPolicy (QAbstractScrollArea::AdjustToContents);
70+ setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
71+ setHorizontalScrollMode (QAbstractItemView::ScrollPerPixel);
6972
7073 setSelectionMode (QAbstractItemView::NoSelection);
7174 setRootIsDecorated (false );
@@ -83,13 +86,8 @@ NetView::NetView(NetManager *manager)
8386 connect (this , &NetView::activated, this , &NetView::onActivated);
8487
8588 // 支持在触摸屏上滚动
86- QScroller::grabGesture (viewport (), QScroller::TouchGesture);
87- QScrollerProperties sp = QScroller::scroller (viewport ())->scrollerProperties ();
88- sp.setScrollMetric (QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
89- sp.setScrollMetric (QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
90- sp.setScrollMetric (QScrollerProperties::DecelerationFactor, 0.5 );
91- sp.setScrollMetric (QScrollerProperties::MaximumVelocity, 0.5 );
92- QScroller::scroller (viewport ())->setScrollerProperties (sp);
89+ setAttribute (Qt::WA_AcceptTouchEvents, true );
90+ viewport ()->setAttribute (Qt::WA_AcceptTouchEvents, true );
9391}
9492
9593NetView::~NetView () = default ;
@@ -183,6 +181,74 @@ void NetView::rowsInserted(const QModelIndex &parent, int start, int end)
183181
184182bool NetView::viewportEvent (QEvent *event)
185183{
184+ const QEvent::Type type = event->type ();
185+ if (type == QEvent::TouchBegin || type == QEvent::TouchUpdate ||
186+ type == QEvent::TouchEnd || type == QEvent::TouchCancel) {
187+
188+ QTouchEvent *te = static_cast <QTouchEvent *>(event);
189+ if (te->points ().isEmpty ()) {
190+ event->accept ();
191+ return true ;
192+ }
193+
194+ QEventPoint pt = te->points ().first ();
195+
196+ switch (type) {
197+ case QEvent::TouchBegin: {
198+ m_touchPressPos = pt.globalPosition ();
199+ m_isDrag = false ;
200+ break ;
201+ }
202+ case QEvent::TouchUpdate: {
203+ QPointF delta = pt.globalPosition () - m_touchPressPos;
204+
205+ if (!m_isDrag && (qAbs (delta.y ()) >= QApplication::startDragDistance () || qAbs (delta.x ()) >= QApplication::startDragDistance ())) {
206+ m_isDrag = true ;
207+ }
208+
209+ if (m_isDrag) {
210+ if (qAbs (delta.y ()) > 0 && verticalScrollBar ()) {
211+ verticalScrollBar ()->setValue (verticalScrollBar ()->value () - delta.y ());
212+ }
213+ if (qAbs (delta.x ()) > 0 && horizontalScrollBar ()) {
214+ horizontalScrollBar ()->setValue (horizontalScrollBar ()->value () - delta.x ());
215+ }
216+ m_touchPressPos = pt.globalPosition ();
217+ }
218+ break ;
219+ }
220+ case QEvent::TouchEnd: {
221+ if (!m_isDrag) {
222+ // Determine the correct target widget for the click
223+ QWidget *target = viewport ();
224+ QPoint widgetPos = pt.position ().toPoint ();
225+
226+ if (QWidget *child = target->childAt (widgetPos)) {
227+ target = child;
228+ if (target) {
229+ widgetPos = target->mapFrom (viewport (), widgetPos);
230+ }
231+ }
232+
233+ QMouseEvent press (QEvent::MouseButtonPress, widgetPos, pt.globalPosition (), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
234+ QCoreApplication::sendEvent (target, &press);
235+ QMouseEvent release (QEvent::MouseButtonRelease, widgetPos, pt.globalPosition (), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
236+ QCoreApplication::sendEvent (target, &release);
237+ }
238+ break ;
239+ }
240+ case QEvent::TouchCancel: {
241+ m_isDrag = false ;
242+ break ;
243+ }
244+ default :
245+ break ;
246+ }
247+
248+ event->accept ();
249+ return true ;
250+ }
251+
186252 switch (event->type ()) {
187253 case QEvent::HoverLeave: {
188254 setCurrentIndex (QModelIndex ());
0 commit comments