2016-04-12 26 views
1

私はPyQt5プロジェクトに取り組んでいますが、C++/C++ソリューションもPythonでも動作する可能性があるので、C++/Qtの解答もうれしく思います。QLabelのスペースにテキストを埋め込む方法を教えてください。

私は、水平レイアウトとそれにQLabelを持つMainWindowを持っています。

私のQLabelのサイズポリシーは「展開中」なので、すべてのウィンドウがQLabelで埋められます。

ただし、QLabelで表示されるテキストのサイズは変更されません。 QLabelのサイズの限界で、ウィンドウが大きくなるとテキストが大きくなり、可能な限り大きくなるようにしたいと思います。

私はQWidget::adjustSize()について聞いたことがありますが、使い方を理解できませんでした。 QtDesignerのQLabelのオプションscaledContentsは何もしないので、pixmapを使用している場合にのみ便利です。

私の解決方法は、私のウィンドウのresizeEvent()メソッドを再実装し、自分のラベルのフォントサイズをsetFont()に変更することです。しかし、私はより簡単な解決策が必要だと思います。またとmyTextFontSizeとの間に線形関係を作るため、resizeEvent()の方法はあまり良くないので、myWindowWidthだけ増加すると、が増えてmyWindowHeightが増えて悪くなります。

答えて

1

これは解決策を指す簡単なスケッチです。ラベルから派生する代わりに、任意のラベルにイベント・フィルターをインストールして、そのテキストを使用可能なスペースに埋めることができます。フィルタは既存のscaledContentsプロパティを使用し、テキストコンテンツへの適用範囲を拡張します。

ニュートンのアルゴリズムを使用して、ラベルのフォントサイズを調整して、使用可能なスペースを埋めます。単語の折り返しを有効にするラベルを使用するには、いくつかの調整が必要です。フォントサイズは決して合うものをオーバーシュートしません。

// 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" 
関連する問題