2015-01-15 13 views
5

Tôi đã gặp phải một chút vấn đề liên quan đến Trình duyệt web danh sách trắng mà công ty tôi đang phát triển/duy trì cho một trong số chúng tôi dòng sản phẩm. Trình duyệt chạy trên đầu trang Qt 4.8.6, sử dụng qtwebkit (Di chuyển đến 5.X sẽ là lý tưởng, nhưng hệ điều hành Linux nhúng mà chúng tôi đang sử dụng quá cũ để hỗ trợ các phiên bản mới hơn dựa trên thử nghiệm của chúng tôi và nâng cấp lên phiên bản mới hơn Hệ điều hành là quá tốn kém cho chúng tôi/khách hàng của chúng tôi). Giao diện chính cho trình duyệt là màn hình cảm ứng 6x8, được gắn bên trong buồng lái máy bay.QtWebView - Cách bật cuộn trang và cuộn các phần tử trong một trang (ví dụ: Google Maps)

Đối với các trang web có những thứ như bản đồ có thể cuộn/được nhúng (ví dụ: Google Maps), người dùng trình duyệt muốn có khả năng kéo toàn bộ trang khi họ chọn thứ gì đó bên ngoài bản đồ và kéo bản đồ mà không cần cuộn toàn bộ trang) khi bản đồ được chọn (Ala hầu hết các trình duyệt di động phổ biến).

Như vậy đến nay, tôi có thể làm cái này hay cái khác, nhưng không phải cả hai:

  • Khi tôi treo xử lý chuột vào một QWebView hoặc QGraphicsWebView, tôi có thể biến con trỏ vào một bàn tay và rất dễ dàng hỗ trợ kéo toàn bộ trang web. Tuy nhiên, điều đó ngăn cản khả năng xử lý các sự kiện chuột của trang khi người dùng kéo bản đồ (tức là khi người dùng kéo qua bản đồ, nó sẽ kéo toàn bộ trang mà không di chuyển bản đồ).

  • Khi tôi không thêm vào móc để xử lý sự kiện chuột, những thứ như bản đồ có thể cuộn bằng cách thả/kéo chúng, nhưng tất nhiên người dùng mất khả năng kéo toàn bộ trang.

Ngay bây giờ, trình duyệt sử dụng sau, với thanh cuộn tàn tật và một hướng mũi tên lớp phủ để cho phép người dùng di chuyển toàn bộ trang (như kích thước màn hình là có hạn, và scrollbars chiếm quá nhiều không gian khi họ có kích thước đủ lớn để người dùng tương tác với họ) ... nhưng điều này không lý tưởng.

Câu hỏi của tôi: Có cách nào dễ dàng để làm cho trang đó và các thành phần trong một trang có thể được cuộn liền mạch không?

Cảm ơn! Rob

Trả lời

2

Dường như với tôi như bạn cần kiểm tra xem bạn có trên bản đồ như vậy và bỏ qua (chuyển qua) sự kiện trong trường hợp đó hay không. Tôi nghĩ rằng bạn sẽ có thể làm điều gì đó như thế này:

bool GraphicsWebView::isOverMap(QPoint pos) { 
    QWebPage* webPage = this->page(); 
    if (webPage) { 
     QWebFrame* webFrame = webPage->frameAt(pos); 
     if (webFrame) { 
      QString selectorQuery = "#map-canvas"; // Based on https://developers.google.com/maps/tutorials/fundamentals/adding-a-google-map 
      QList<QWebElement> list = webFrame->findAllElements(selectorQuery).toList(); // Find all the maps! 

      foreach(QWebElement element, list) { 
       if (element.geometry().contains(pos)) { 
        return true; // Cursor is over a map 
       } 
      } 
     } 
    } 
    return false; // No match 
} 

Rõ ràng đây là một chức năng khá cụ thể nhưng có lẽ là một cách để tìm ra một truy vấn chọn tốt hơn sẽ áp dụng cho tất cả những loại QWebElement .

Giả sử bạn treo các sự kiện chuột bởi subclassing QGraphicsWebView và reimplementing void mouseMoveEvent(QGraphicsSceneMouseEvent * event), tôi đề nghị bạn làm điều gì đó như:

void GraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { 
    if (isOverMap(mapFromScene(event->scenePos()).toPoint())) { // We got a map! 
     event.ignore(); // Clear the accept flag 
     return; // Return, we're done here 
    } 

    handleMoveView(); // Not over any maps, let's scroll the page 
} 

phần của doc giải thích cách sự kiện được xử lý liên quan đến các mục trên cùng với. Tôi đặc biệt khuyên bạn nên đọc đoạn thứ ba.

Hy vọng điều đó sẽ hữu ích!

EDIT: Đã nghiên cứu nhiều hơn một chút và có vẻ như một cái gì đó như thế có thể là chung chung hơn: graphicsView.focusItem()->flags().testFlag(QGraphicsItem::ItemIsMovable);

Đó là tại ít nhất là rất đáng được nghiên cứu như một sự thay thế để isOverMap()

EDIT: Gotcha, đây là một cái gì đó bạn có thể thử sau đó. Bắt đầu bằng cách phân lớp QGraphicsSceneMouseEvent và thêm tín hiệu được gọi là void destroyedWithoutAccept() được phát ra trong trình hủy nếu sự kiện chưa được chấp nhận.

Sau đó sửa đổi mouseMoveEvent trông như thế này:

void GraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { 
    MyEvent myEvent = new MyEvent(event); // Copy event 
    event.accept(); // accept original event 
    connect(myEvent, SIGNAL(destroyedWithoutAccept), 
      this, SLOT(handleMoveView)); // Callback if unused 

    QGraphicsWebView::mouseMoveEvent(myEvent); // Pass it to Base class 
} 

Nếu thành công, nó có thể giới thiệu một chút chậm trễ nếu deleteLater được sử dụng để tiêu diệt nó. Nhưng trong trường hợp đó, thực hiện lại nó là tốt.

+0

Cảm ơn bạn đã trả lời! Thật không may, Google Maps chỉ là một ví dụ ... các hãng hàng không đang thực sự tìm cách sử dụng một loại thời tiết, theo dõi chuyến bay và các trang web liên quan khác. Một số người trong số họ có bản đồ tương tác và một số không (mỗi trang web thực hiện là duy nhất là tốt). Tôi chỉ đề cập đến Google Maps, vì nó là cái tôi hiện đang sử dụng để thử nghiệm. Trước đây tôi cũng đã thử hành vi thử nghiệm hit ở trên, nhưng không có bất kỳ quyền truy cập nào (nó luôn báo cáo 'sai' khi bạn truy vấn cho dù đó là di chuyển hay không). – Bob

+0

Không sao cả. Chỉ cần tạo một bản chỉnh sửa mới để tạo ra một thiết kế tốt hơn và linh hoạt hơn. – Atlante45

Các vấn đề liên quan