2012-03-23 36 views
10

Theo tài liệu Qt, nó "Chuẩn bị mục cho một thay đổi hình học. Gọi hàm này trước khi thay đổi trực tiếp của một mục để giữ chỉ mục của QGraphicsScene được cập nhật. PrepareGeometryChange() sẽ gọi update() nếu điều này là cần thiết. "Công cụ QGraphicsItem :: prepareGeometryChange() hoạt động như thế nào?

Điều tôi không hiểu là cách QGraphicsItem biết khi nào thay đổi trực tiếp giới hạn và cách thức nó biết khi nào nên gọi cập nhật(). Bạn có bao giờ phải gọi update() cho chính mình sau khi gọi hàm prepareGeometryChange() và sau đó thay đổi hình chữ nhật bounding?

Tôi đánh giá rất cao một số thông tin chi tiết về những gì dường như là một phương pháp thông minh.

Trả lời

15
  • cách thức QGraphicsItem biết khi nào đường biên giới thay đổi?

Tôi nghĩ bạn biết. Giả sử bạn có một QGraphicsItemGroup tổng hợp một số mục con, và bạn chỉ muốn hiển thị một đứa trẻ tại một thời điểm. Rect giới hạn của mục nhóm cần phải được giống như rect giới hạn của mục được chọn hiện thời:

QRectF MyItemGroup::boundingRect() const 
{ 
    QRectF rect; 
    if (currentItem_) { 
     rect = currentItem_->boundingRect(); 
    } 
    return rect; 
} 

Giả sử bạn có một phương pháp để thay đổi mà một trong những trẻ em phải được hiển thị:

void MyItemGroup::setCurrentItem(MyItem * item) 
{ 
    if (list_of_items_.contains(item)) { 
     prepareGeometryChange(); 
     currentItem_ = item; 
    } 
} 

Nếu bạn bình luận về chuẩn bịGhiometryChange, khung nhìn sẽ không hỏi lại đối với đường biên giới của MyItemGroup, và bản cập nhật của mục (được kích hoạt ở một nơi khác) sẽ liên quan đến sai lệch.

  • cách thức biết khi nào nên gọi cập nhật()?

Theo với các nguồn QGraphicsItem, bên trong bản cập nhật prepareGeometry phương pháp được gọi là chỉ trong hai trường hợp:

  1. nếu ai đó được kết nối với changed tín hiệu
  2. nếu cảnh không có quan điểm
  3. hơn

chi tiết here

  • Bạn có bao giờ phải gọi bản cập nhật() sau khi gọi prepareGeometryChange() và sau đó thay đổi hình chữ nhật giới hạn?

Tôi nghĩ câu trả lời là Không. Ngoài cuộc gọi đến số update, prepareGeometryChange đánh dấu là khu vực mục bẩn trên hiện trường, khiến bản thân khu vực đó trở lại. Theo kinh nghiệm của tôi, điều này đã hoàn thành trong 100% các trường hợp, vì vậy tôi không cần phải gọi update().

+1

thông thường hơn, bạn có thể chính xác nó nên được gọi bất cứ khi nào đầu vào của ':: boundingRect()' thay đổi tính toán. Ví dụ của bạn là đúng mặc dù. – azf

+0

Cảm ơn câu trả lời của bạn. Tuy nhiên, tôi vẫn tự hỏi * làm thế nào * nó hoạt động. Ví dụ, khi nào nó gọi update()? – Anthony

+0

câu trả lời được cập nhật, hy vọng điều này sẽ hữu ích. – Masci

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