2012-12-31 17 views
5

Mam niestandardowy widget, który ma ogólny układ QVBoxLayout. Zawiera kilka etykiet, QFormLayout, przycisk i odcinek do zjedzenia całej przestrzeni. Jedna z etykiet może być dość duża, więc staram się upewnić, że nie ma żadnych dziwnych przypadków, w których tekst jest nieczytelny. Widżet jest zawarty w QScrollArea, aby zapewnić, że jeśli użytkownik zmniejszy całe okno, wszystkie aspekty widżetu będą nadal widoczne.QLabel odcinanie tekstu przy zmianie rozmiaru

Wygląda na to, że wielkość etykiety QLabel jest dobra, ale po osiągnięciu pewnego poziomu ciasnoty po prostu odcina kilka ostatnich wierszy etykiety i przydziela przestrzeń do odcinka u dołu widgetu.

Robię to wszystko w kodzie bez projektanta, więc jest całkowicie możliwe, że po prostu czegoś brakuje. Te elementy składowe są do ogólnej QVBoxLayout w następującej kolejności:

OverallLayout = new QVBoxLayout(this); 
Title   = new QLabel(); 
Description = new QLabel(); 
SubRegion  = new QFormLayout(); 
Button  = new QButton(); 
... 
// set text values, wordWrap(true), and Font for labels 
OverallLayout->addWidget(Title); 
OverallLayout->addWidget(Description); 
OverallLayout->addLayout(SubRegion); 
OverallLayout->addStrut(MIN_DIST); 
OverallLayout->addWidget(Button); 
OverallLayout->addStretch(STRETCH_FACTOR); 

Wyniki badania: Badanie wyników zwróconych z funkcji QLabel w sizeHint() zwrócone wartości nie wydają się zmieniać wraz widget kurczy w poziomie. Jednak QLabel rozszerza się, aby zająć bardziej pionowy pokój (153 vs wskazówka 103), po prostu nie wystarczy, aby zmieścić cały tekst. Kiedy QLabel jest po raz pierwszy pokazany, ma mniej pikseli niż jego rozmiarHint, ale wciąż wystarcza do wysokości heightForWidth. Gdy jest zmieniany, ma 30 mniej niż jego wysokość, ale więcej niż jego rozmiarHint.

Sprawdziłem i duża wartość QLabel ma wartości hasHeightForWidth() i wordWrap() ustawione na true. Co ja robię źle?

+0

Czy możesz dodać fragment kodu, do którego te widgety są dodawane do układu? Myślę, że powinieneś ustawić minimalny rozmiar QLabel przez setMinimumHeight(), tak aby nie było odcięcia. Alternatywnie możesz ustawić maksymalną wysokość elementu dystansowego. –

+0

Jednym ze sposobów rozwiązania problemu jest powiązanie z metodą zmiany rozmiaru i ustawienie minimalnej wysokości na wartość heightForWidth (width) dla etykiety Description. Wydaje się to trochę kludgey, więc zastanawiałem się, jaki byłby właściwy sposób, aby menedżer układu wykonał swoją pracę. – ElCraneo

+0

Ale co z sugestią użycia 'setMinimumHeight()'? – jdi

Odpowiedz

2

Skończyłem z metodą nadpisywania funkcji widżetu resizeEvent(QResizeEvent *evt), aby dynamicznie ustawiać maksymalną wartość QLabel.

void MyWidget::resizeEvent (QResizeEvent *evt) { 
    int newHeight = Description.heightForWidth(Description.width()); 
    Description.setMaximumHeight(newHeight); 
    QWidget::resizeEvent(evt); 
    // Note: I'm not sure if this last step is necessary 
} 

Ciekawa pozycja zwrócić uwagę na to, że jeśli zarówno setMinimumHeight(newHeight) i setMaximumHeight(newHeight) etykieta będzie rosnąć pionowo, aby dopasować tekst, ale to nigdy nie będzie się kurczyć, gdy etykieta rośnie poziomo i nie wymaga dodatkowej przestrzeni. Domyślam się, że heightForWidth(int w) zwraca maksimum między minimum widmową widgetu a faktycznie potrzebnymi pikselami. Dziwne jest to, że nie wydaje się, aby zwracać wartość większą niż obecna maximumHeight.

Powiązane problemy