2016-04-12 15 views
1

Ich arbeite an einem PyQt5-Projekt, würde aber gerne C++/Qt-Antwort lesen, weil C++ - Lösungen auch auf Python funktionieren.Wie kann der Text den gesamten QLabel-Bereich füllen?

Ich habe ein MainWindow mit einem horizontalen Layout und einem QLabel darin.

Die Größe meiner QLabel-Richtlinie ist "Expanding", daher wird mein gesamtes Fenster von QLabel ausgefüllt.

Der von QLabel angezeigte Text ändert jedoch nicht seine Größe. Ich würde mir wünschen, dass der Text wächst, wenn das Fenster wächst, und so groß wie möglich sein sollte, im Rahmen der QLabel-Größe.

Ich habe von QWidget::adjustSize() gehört aber konnte nicht herausfinden, wie man es benutzt. Die Option scaledContents für meine QLabel auf QtDesigner tut nichts, also denke ich, dass es nur für die Verwendung von Pixmap nützlich ist.

Im Moment ist meine Lösung, die resizeEvent() Methode meines Fensters neu zu implementieren und die Schriftgröße meines Etiketts mit setFont() zu ändern. Aber ich denke, dass es eine einfachere Lösung geben muss. Darüber hinaus ist meine resizeEvent() Methode nicht sehr gut, weil ich eine lineare Beziehung zwischen myWindowWidth* myWindowHeight und myTextFontSize mache, daher, wenn nur myWindowWidth erhöhen, myTextFontSize erhöht und Kräfte myWindowHeight zu erhöhen, was schlecht ist.

Antwort

1

Dies ist eine schnelle Skizze, die auf eine Lösung hinweisen könnte. Anstatt von einem Label abzuleiten, kann ein Ereignisfilter auf einem beliebigen Label installiert werden, damit sein Text den verfügbaren Platz ausfüllt. Der Filter verwendet die vorhandene scaledContents-Eigenschaft und erweitert seine Anwendbarkeit auf Textinhalt.

Die Schriftgröße des Labels wird mithilfe des Newton-Algorithmus angepasst, um den verfügbaren Platz zu füllen. Einige Anpassungen wären erforderlich, um mit Etiketten arbeiten zu können, die den Zeilenumbruch ermöglichen. Die Schriftgröße sollte dann niemals über das hinausgehen, was passt.

// https://github.com/KubaO/stackoverflown/tree/master/questions/label-text-size-36575192 
#include <QtWidgets> 

class LabelStretcher : public QObject { 
    Q_OBJECT 
public: 
    LabelStretcher(QObject * parent = 0) : QObject(parent) { 
     apply(qobject_cast<QLabel*>(parent)); 
    } 
    void apply(QLabel * label) { if (label) label->installEventFilter(this); } 
protected: 
    bool eventFilter(QObject * obj, QEvent * ev) Q_DECL_OVERRIDE { 
     if (ev->type() != QEvent::Resize) return false; 
     auto label = qobject_cast<QLabel*>(obj); 
     if (!label || label->text().isEmpty() || !label->hasScaledContents()) return false; 
     qDebug() << "pre: " << label->minimumSizeHint() << label->sizeHint() << label->size(); 

     static auto dSize = [](const QSize & inner, const QSize & outer) -> int { 
     auto dy = inner.height() - outer.height(); 
     auto dx = inner.width() - outer.width(); 
     return std::max(dx, dy); 
     }; 
     static auto f = [](qreal fontSize, QLabel * label) -> qreal { 
     auto font = label->font(); 
     font.setPointSizeF(fontSize); 
     label->setFont(font); 
     auto d = dSize(label->sizeHint(), label->size()); 
     qDebug() << "f:" << fontSize << "d" << d; 
     return d; 
     }; 
     static auto df = [](qreal fontSize, QLabel * label) -> qreal { 
     if (fontSize < 1.0) fontSize = 1.0; 
     return f(fontSize + 0.5, label) - f(fontSize - 0.5, label); 
     }; 

     // Newton's method 
     auto font = label->font(); 
     auto fontSize = font.pointSizeF(); 
     int i; 
     for (i = 0; i < 5; ++i) { 
     auto d = df(fontSize, label); 
     qDebug() << "d:" << d; 
     if (d < 0.1) break; 
     fontSize -= f(fontSize, label)/d; 
     } 
     font.setPointSizeF(fontSize); 
     label->setFont(font); 
     qDebug() << "post:" << i << label->minimumSizeHint() << label->sizeHint() << label->size(); 
     return false; 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QLabel label{"Hello There!"}; 
    label.setScaledContents(true); 
    label.show(); 
    LabelStretcher stretch(&label); 
    return app.exec(); 
} 

#include "main.moc" 
Verwandte Themen