2011-11-25 11 views
7

Tôi đang viết một plugin QML extension và tôi đang tìm cách truy cập kích thước của phần tử mà tôi vừa triển khai.Đọc kích thước phần tử QML được xác định bởi anchors.fill: parent

Ngay bây giờ các yếu tố mới (đặt tên CustomElement) có thể được tạo ra với kích thước bất kỳ người dùng muốn bằng cách định nghĩa nó rộngchiều cao giá trị, vì vậy trên QML nộp người dùng có thể làm:

CustomElement 
{ 
    id: my_elem 
    width: 800 
    height: 600 
} 

Nhưng tôi muốn để có thể lấy lại thông tin kích thước khi người dùng cấu hình kích thước thông qua một anchor, như thế này:

Rectangle 
{ 
    width: 800 
    height: 600 

    CustomElement 
    { 
     id: my_elem 
     anchors.fill: parent 
    } 
} 

Tôi không biết cách truy cập thông tin anchors.

Lớp plugin được định nghĩa là:

class CustomElement: public QDeclarativeItem 
{ 
    Q_OBJECT 
    //Q_PROPERTY() stuff 
public: 
    // ... 
}; 

Trong constructor của các plugin, tôi đặt QGraphicsItem::ItemHasNoContents false:

CustomElement::CustomElement(QDeclarativeItem* parent) 
: QDeclarativeItem(parent) 
{ 
    qDebug() << "CustomElement::CustomElement parent is:" << parent; 

    setFlag(QGraphicsItem::ItemHasNoContents, false); 
} 

Sau khi thêm debug, tôi nhận thấy rằng parent0 , điều này giải thích tại sao tôi không thể truy xuất thông tin hữu ích với các phương thức khác là boundingRect(). Rõ ràng, vấn đề là plugin của tôi không có cha mẹ. Làm cách nào để giải quyết vấn đề này?

Trả lời

5

Giải quyết.

Đọc When is the parent set? đã giúp tôi tìm thấy những gì tôi cần làm. Plugin này là một thành phần đồ họa (tức là có giao diện trực quan) có nghĩa là nó sẽ được vẽ trên màn hình tại một số điểm. Khi Qt kết thúc tải thành phần của bạn, nó gọi một phương thức có tên là componentComplete() để thông báo cho bạn về điều đó.

Tất cả tôi phải làm là thêm phương pháp này để định nghĩa lớp của tôi như là một phương pháp công cộng:

virtual void componentComplete(); 

và thực hiện nó như:

void CustomElement::componentComplete() 
{ 
    Q_D(CustomElement);  

    // Call superclass method to set CustomElement() parent 
    QDeclarativeItem::componentComplete(); 
} 

Gọi phương thức của lớp cha dường như để thiết lập phụ huynh của plugin của tôi và điều này cho phép tôi truy cập vào thông tin được đặt bởi anchors.fill: parent.

Sau đó, tất cả những gì phải làm lấy thông tin này là:

Q_Q(Video); 
qDebug() << "CustomElement::play: widget size is " << q->width() << "x" << q->height(); 
+2

Bạn chỉ cần đặt dấu chấm hết cho một tìm kiếm ba ngày !! Mà tôi có thể upvote mười lần – Martin

+0

Hmm nó vẫn không làm việc cho tôi. Q_D và Q_Q là gì? Nếu tôi gọi Q_D trên tên lớp của tôi, tôi nhận được một lỗi comiler. Bạn có thể đăng một ví dụ hoàn chỉnh? – Martin

+0

http://www.qtcentre.org/threads/20953-Q_D-and-Q_Q – karlphillip