- 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:
- nếu ai đó được kết nối với
changed
tín hiệu
- nếu cảnh không có quan điểm
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().
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
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
câu trả lời được cập nhật, hy vọng điều này sẽ hữu ích. – Masci