2012-01-09 35 views
6

Trong Qt, tôi có một widget tổng hợp bao gồm một số QLabels được sắp xếp bên trong QBoxLayouts. Khi tiện ích được thay đổi kích thước, tôi muốn văn bản nhãn mở rộng để lấp đầy khu vực nhãn và tôi đã triển khai thay đổi kích thước của văn bản trong resizeEvent.Tự động thay đổi kích thước văn bản nhãn trong Qt - hành vi lạ

Điều này có tác dụng nhưng dường như có một số loại phản hồi xảy ra. Widget tổng hợp được đặt trong một cửa sổ chính bên trong QBoxLayout cùng với một số tiện ích khác. Khi cửa sổ chính được làm nhỏ hơn, tiện ích tổng hợp ban đầu duy trì kích thước của nó và sau đó thay đổi kích thước về kích thước chính xác trong một vài bước (khoảng 10-15). Nếu chiều cao của văn bản được đặt cao hơn khoảng 0,8 lần chiều cao nhãn thì việc thay đổi kích thước văn bản và chứa tiện ích con sẽ tăng lớn hơn với mỗi bước cho đến khi ứng dụng gặp sự cố.

Đây có phải là cách tiếp cận chính xác để đạt được hiệu ứng này không? Nếu vậy, vấn đề có thể là gì với việc thay đổi kích thước?

Dưới đây là mã resizeEvent.

def resizeEvent(self, evt): 
     print("resizeEvent", evt.size().width(), evt.size().height()) 
     QFrame.resizeEvent(self, evt) 

     dataLabels = self.dataPanels.values() 

     for label in dataLabels:    
      font = label.font() 
      h = label.height() 
      h2 = h * 0.8 
      font.setPixelSize(h2) 
      label.setFont(font) 

(sử dụng PyQt4 4.8, Qt 4.7.4, Win 7 & OSX 10,6)

Trả lời

6

Tôi nghĩ rằng vấn đề với thay đổi kích thước do SizePolicy. Hãy thử đặt chính sách về kích thước của label thành Ignored nó sẽ giúp ích.

label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 

Đây có phải là cách tiếp cận chính xác để đạt được hiệu ứng này không?

Có thể có, tìm kiếm nhanh trong tài liệu không đưa ra giải pháp tốt hơn. Nhưng tôi sẽ tạo lớp con của QLabel và thiết lập chính sách và thay đổi kích thước ở đó. Ví dụ:

class StretchedLabel(QLabel): 
    def __init__(self, *args, **kwargs): 
     QLabel.__init__(self, *args, **kwargs) 
     self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 

    def resizeEvent(self, evt): 
     font = self.font() 
     font.setPixelSize(self.height() * 0.8) 
     self.setFont(font) 

Trong trường hợp bạn cần vừa với văn bản không chỉ theo chiều cao, mà theo chiều rộng, một số mã quảng cáo được yêu cầu.

+0

Đặt SizePolicy khắc phục sự cố, cảm ơn. – glennr

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