2010-04-20 19 views
17

Cố gắng lấy Chiều cao và Chiều rộng của GtkEventBox.
Đã cố gắng theo dõi mọi thứ.Hoàn toàn chán ngán với chiều cao và chiều rộng của tiện ích Gtk

GtkRequisition requisition; 
gtk_widget_get_child_requisition(widget, &requisition); 
// Getting requisition.height 0 
---------------------------------------------------------- 

widget->allocation-x //getting 0 
widget->allocation-height //getting -1 
---------------------------------------------------------- 

gtk_widget_get_size_request(widget, &height, &width); // Again getting 0 
-------------------------------------------------------------------------- 

Thật không tốt khi Gtk chưa cung cấp chức năng đơn giản sẽ cung cấp cho bạn chiều cao được hiển thị thực tế và với tiện ích.

Bất kỳ ai cố gắng đạt được chiều cao và bằng GtkWidget?

Trả lời

28

Khi widget của bạn đã được thực hiện (cho một kích thước tùy thuộc vào những gì nó có chứa cha mẹ có thể cung cấp cho nó), bạn sẽ có thể để có được những giá trị này với widget->allocation.widthwidget->allocation.height.

Không có gì sai trong cách gtk thực hiện việc này. Có một sự khác biệt giữa kích thước mà một widget muốn có và kích thước thực sự của nó. Vì vậy, thời gian đọc các giá trị này là quan trọng. Có phương thức 'get' cho các biến này sẽ không thay đổi thực tế là chúng chưa được khởi tạo.

Cách thông thường mọi người đi xung quanh này là nhấn vào tín hiệu size-allocate được phát ra khi tiện ích có kích thước thực mới. Một cái gì đó như thế này:

void my_getsize(GtkWidget *widget, GtkAllocation *allocation, void *data) { 
    printf("width = %d, height = %d\n", allocation->width, allocation->height); 
} 

Và trong vòng lặp chính của bạn ở đâu đó, kết nối tín hiệu:

g_signal_connect(mywidget, "size-allocate", G_CALLBACK(my_getsize), NULL);

3

Bạn có chắc chắn rằng tiện ích của bạn đã được hiển thị và nhận ra/ánh xạ? Bạn không thể nhận được kích thước cho đến khi các widget đã được đặt ra "cho thực".

Hãy thử nghe tín hiệu map-event.

+1

Tôi đang thực hiện 'gtk_widget_show' trước khi gọi hàm này. nhưng lúc đó nó không thực sự được vẽ trên màn hình (vì bố mẹ không được hiển thị) nhưng tôi cần những tham số này trước khi nó được vẽ trên màn hình vì tôi cần truyền các giá trị này cho một số quy trình khác. vậy làm thế nào để tôi có được nó? – User7723337

+0

@PP: Tôi không nghĩ bạn có thể biết, trước khi bố cục thực sự xảy ra. Có lẽ bạn có thể thay đổi thiết kế của bạn để quá trình khác có thể nhận được các tọa độ khi chúng được biết? – unwind

4

Sử dụng gtk_widget_size_request(), chứ không phải gtk_widget_get_size_request().

http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-size-request

+0

'nhận yêu cầu kích thước yêu cầu tiện ích phải được liên kết với màn hình' Tôi muốn nhận kích thước của tiện ích trước khi hiển thị trên màn hình. – User7723337

+0

Nó không phải được hiển thị, chỉ cần liên kết với màn hình - để biết phông chữ nào sử dụng, v.v. –

+0

Cảm ơn, nó đã hoạt động 'gtk_widget_size_request()' Cảm ơn bạn rất nhiều. – User7723337

5

Nếu bạn đang sử dụng GTK3, và widget đã được thực hiện, bạn có thể yêu cầu những gì nó có được phân bổ. Điều này có lợi thế là không gian mà nó thực sự có trái với những gì nó yêu cầu.

//GtkWidget* widget; 
    GtkAllocation* alloc = g_new(GtkAllocation, 1); 
    gtk_widget_get_allocation(widget, alloc); 
    printf("widget size is currently %dx%d\n",alloc->width, alloc->height); 
    g_free(alloc); 
+8

Không có điểm nào trên phân bổ động dữ liệu ở đây, chỉ cần khai báo biến phân bổ của bạn trên ngăn xếp, không phải trên đống. – liberforce

+2

giống như thế này?: 'Phân bổ GtkAllocation; gtk_widget_get_allocation (tiện ích con và phân bổ); printf ("kích thước tiện ích hiện là% dx% d \ n", alloc.width, alloc.height); ' – revo

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