2012-12-31 20 views
5

Ich habe ein benutzerdefiniertes Widget, das ein Gesamtlayout eines QVBoxLayout hat. Es enthält mehrere Labels, ein QFormLayout, eine Schaltfläche und eine Strecke, um den überschüssigen Platz zu verschlingen. Eine der Bezeichnungen kann ziemlich groß sein, deshalb versuche ich sicherzustellen, dass es keine merkwürdigen Fälle gibt, in denen der Text nicht lesbar ist. Das Widget ist in einer QScrollArea enthalten, um sicherzustellen, dass, wenn der Benutzer das gesamte Fenster verkleinert, alle Aspekte des Widgets weiterhin sichtbar sind.QLabel Text auf Größe verkleinern

Die Größe von QLabel scheint sich zu ändern, aber sobald ein bestimmter Punkt der Enge erreicht ist, schneidet es nur die unteren paar Zeilen des Etiketts ab und weist das Leerzeichen der Strecke am unteren Rand des Widgets zu.

Ich mache das alles in Code ohne den Designer, so ist es durchaus möglich, dass ich gerade etwas vermisse. Die Subkomponenten sind mit dem Gesamt QVBoxLayout in der folgenden Reihenfolge hinzugefügt:

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); 

Testergebnisse: Die Untersuchung der zurückgegebenen Ergebnisse aus der QLabel der sizeHint() Funktion, kehrten die Werte erscheinen nicht als das Widget horizontal geschrumpft wird sich ändern. Der QLabel erweitert sich jedoch, um mehr vertikalen Raum einzunehmen (153 gegenüber dem Hinweis von 103), gerade nicht genug, um den gesamten Text zu berücksichtigen. Wenn das QLabel zum ersten Mal gezeigt wird, hat es weniger Pixel als seine Größe, aber immer noch genug für seinen Höhe-für-Breite-Betrag. Wenn es in der Größe geändert wird, hat es 30 weniger als seinen heightForWidth-Betrag aber mehr als seine sizeHint.

Ich habe überprüft und das große QLabel hat seine Werte haseheightForWidth() und wordWrap() auf True gesetzt. Was mache ich falsch?

+0

Können Sie das Code-Snippet hinzufügen, in dem diese Widgets zum Layout hinzugefügt werden? Ich denke, dass Sie die Mindestgröße von QLabel durch setMinimumHeight() festlegen sollten, so dass es kein Cut-off gibt. Alternativ können Sie einen maximalen Höhenwert für das Abstandselement festlegen. –

+0

Eine Möglichkeit, das Problem zu beheben, ist das Verknüpfen mit der resized-Methode und das Festlegen der Mindesthöhe auf den Wert heightForWidth (width) für das Description-Label. Das scheint ein bisschen klüger zu sein, also habe ich mich gefragt, was der richtige Weg wäre, um den Layout-Manager dazu zu bringen, seinen Job zu machen. – ElCraneo

+0

Aber was ist mit dem Vorschlag, 'setMinimumHeight()' zu verwenden? – jdi

Antwort

2

Ich endete mit der Methode des Überschreibens der Widget resizeEvent(QResizeEvent *evt) Funktion, um den maximalen Wert der QLabel dynamisch festzulegen.

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 
} 

Ein interessanter Punkt ist zu beachten, dass, wenn Sie sowohl setMinimumHeight(newHeight) und setMaximumHeight(newHeight) tun das Etikett vertikal wachsen wird, den Text zu passen, aber es wird nie schrumpfen, wenn das Etikett horizontal wächst und braucht nicht den zusätzlichen Platz. Meine Vermutung ist, dass heightForWidth(int w) das Maximum zwischen minimumHeight des Widgets und den tatsächlich benötigten Pixeln zurückgibt. Der seltsame Teil ist, dass es keinen Sinn macht, einen Wert zurückzugeben, der größer ist als die aktuelle maximaleHöhe.