2010-12-10 31 views
5

Tôi đang cố gắng thay đổi kích thước của phân lớp QPushButton trong khi neo một góc do người dùng xác định (không phải lúc nào cũng là góc trên cùng bên trái). QPushButton định nghĩa QFrame làm cha mẹ của nó, và được thả nổi tự do trong cửa sổ. Khi tôi cố gắng thay đổi kích thước của lớp con QPushButton trong mã lớp con, tôi tin rằng nó gây ra rắc rối cho tôi vì các điểm QPoint được cung cấp bởi mouseEvents là cục bộ. Tôi đã thử làm việc với myButton-> mapToGlobal (QPoint) và myButton-> mapFromGlobal nhưng tôi không nghĩ rằng tôi hoàn toàn hiểu cách chúng hoạt động. Một tìm kiếm cho các ví dụ đã để lại cho tôi bàn tay trắng. Bất cứ ai có thể cung cấp một ví dụ ngắn?Qt QPoint bản đồ toàn cầu/cục bộ

Trả lời

12

tọa độ cục bộ (widget) liên quan đến góc trên cùng bên trái của tiện ích. Tọa độ chung là tọa độ màn hình. Chúng dễ dàng chuyển đổi và các sự kiện như QMouseEvent cung cấp cả hai tọa độ cục bộ (pos()) và global (globalPos()). Nếu bạn muốn ánh xạ từ Widget A đến Widget B, bạn có thể làm

const QPoint global = a->mapToGlobal(localPosInA); 
const QPoint localInB = b->mapFromGlobal(global); 

Hoặc, ngắn hơn:

const QPoint localInB = a->mapTo(b, localPosInA); 

Ví dụ: Giả sử bạn có một W1 phụ tùng top-level tại (100.110) (tọa độ màn hình), có phụ tùng con w2 tại (10,10) (tọa độ w1) và sự kiện chuột trong w2 tại (20, 20) (tọa độ w2), sau đó vị trí toàn cục của con trỏ chuột là

(100.110) + (10,10) + (20,20) = (130,140) (tọa độ màn hình)

Đó là w2-> mapToGlobal (mousePos).

w2-> mapTo (W1, mousePos) hoặc, như là W1 mẹ của W2, w2-> mapToParent (mousePos) là

(10,10) + (20,20) = (30,30) (tọa độ w1). Có thể dễ nhất là nếu bạn chuyển đổi mọi thứ thành tọa độ toàn cục, thực hiện các phép tính ở đó và sau đó ánh xạ kết quả trở lại tiện ích tức là ngữ cảnh bạn cần.

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