2009-06-24 16 views
8

tôi là tạo ra một số dữ liệu đồ họa hiển thị widget trong Qt4 và tôi đã bị cám dỗ để sử dụng QGraphicsScene cho nó, tạo QGraphicsItem s cho các mục dữ liệu, vvLàm thế nào tôi nên sử dụng một QGraphicsScene với cách bài trí và widget

Tuy nhiên, Tôi muốn thêm một số lớp điều khiển (ví dụ: thanh cuộn, thu phóng + các nút khác - Tôi muốn tạo thành một kiểu tương tự như Google Maps, tức là dữ liệu sẽ được hiển thị trên tất cả tiện ích và các nút sẽ được hiển thị trên đỉnh của chúng) cho tiện ích con. Vì vậy, tôi nghĩ rằng nó có thể là khả thi để thêm chúng vào hiện trường (có lẽ là một đứa trẻ của một QGraphicsGroupItem sẽ được hiển thị trên dữ liệu). Nhưng tôi muốn họ di chuyển & thay đổi kích thước khi tôi đổi kích thước toàn bộ tiện ích, vì vậy tôi nên sử dụng QGraphicsLayout để quản lý chúng. Nhưng vào thời điểm này, tôi phát hiện ra mọi thứ khá phức tạp.

Vấn đề là khi sử dụng QGraphicsLayout, những hạn chế sau đây giữ:

  1. Chỉ một QGraphicsWidget có thể được quản lý bởi một bố trí
  2. QGraphicsLayout chỉ có thể được sử dụng để quản lý trẻ em của một QGraphicsWidget

Điều đó có nghĩa là tôi sẽ phải tạo các điều khiển của mình dưới dạng QGraphicsWidget s, thêm một mức cao nhất QGraphicsWidget vào tiện ích dữ liệu và quản lý t anh ta tự mình kích thước của tiện ích cấp cao nhất này.

Vì vậy, tôi muốn hỏi:

  1. Sẽ không phải là phương pháp cổ điển (tức là sử dụng các vật dụng cũ đồng bằng cho tất cả các điều khiển và sử dụng QGraphicsScene chỉ để hiển thị dữ liệu.) Là hợp lý hơn?

  2. Có lợi thế nào khi sử dụng QGraphicsScene trong trường hợp này (hiệu suất hay tính đơn giản ...)?

  3. Tôi nên sử dụng QGraphicsScene để khai thác thế mạnh của nó như thế nào?

Trả lời

1

Nếu bạn nghĩ rằng QGraphicsScene (hoặc bất kỳ tiện ích con nào khác) phù hợp với hầu hết màn hình, hãy sử dụng. Những gì chúng tôi đã làm trong quá khứ cho những thứ tương tự là tạo một widget tùy chỉnh kế thừa (một cách này hay cách khác) từ QWidget và đặt tiện ích điều khiển trong bố cục ở đầu tiện ích con đó. Điều này có nghĩa là toàn bộ widget sẽ vẽ bất cứ thứ gì bạn muốn vẽ, và các widget điều khiển nằm trên đó, thay đổi kích cỡ khi toàn bộ widget được thay đổi kích thước.

Ngoài ra, một vài lần chúng tôi đã có bố cục quá phức tạp để các tiện ích bố cục dễ dàng xử lý. Thay vì tạo bố cục tùy chỉnh, chúng tôi chỉ định vị chúng không có bố cục và di chuyển chúng trong mã trên sự kiện thay đổi kích thước. Công việc đó rất tốt.

+0

Vấn đề lớn nhất với QGraphicsScene là nó là KHÔNG thực sự là một widget. Nó giống như một bộ sưu tập các vật phẩm (như hình chữ nhật, hình elip ...) được vẽ tự động, có thể được thu nhỏ ... Những gì bạn mô tả là cách cổ điển, đồng bằng cũ, và tôi có thể sẽ dính vào đó.Tôi muốn sử dụng các chức năng "sáng bóng và mới", nhưng ở ý nghĩ thứ hai, nó không trông sáng bóng với tôi, ngoại trừ ai đó chứng minh tôi sai :) – jpalecek

+0

jpalecek: kiểm tra "đồng hồ" phụ tùng demo @ http: // www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. Không có gì lạ mắt khi có một widget đồng hồ nhưng thực hiện cho điều đó được thực hiện với QGraphics (Scene | Widget | View | Item). – rasjani

+0

@jpalecek: Tôi không nghĩ QGraphicsScene là một tiện ích, đó là lý do tại sao tôi nói để kế thừa "cách này hay cách khác". Nhưng bạn có một QGraphicsView (hoặc một cái gì đó tương tự), phải không? Bạn có thể muốn đặt các vật dụng của bạn trên đó, trừ khi bạn muốn họ chuyển đổi với cảnh của bạn. Tôi nghĩ trong trường hợp này, cách thức phụ tùng cũ đơn giản hơn và đơn giản hơn. –

6

Kể từ khi Qt 4.4 bạn có thể nhúng widget cổ điển trong một QGraphicsScene bằng cách sử dụng QGraphicsProxyWidget:

QWidget *widget = new QWidget; 
QGraphicsScene scene; 
QGraphicsProxyWidget *proxy = scene.addWidget(widget); 
Các vấn đề liên quan