25

サイズ変更可能なウィジェットにQLabel要素があります。テキストは境界をオーバーフローする可能性があるため、アプリケーションをよりエレガントに見せるために、テキスト内の最後の完全に表示された単語の後に省略記号(...)を生成する方法が必要です。

以前はHTML/CSSでレイアウトを作成しtext-overflow: ellipsis;ていましたが、QTクラスの場合はこれに関する情報が見つかりませんでした。

4

3 に答える 3

50

ラベルのサイズ変更イベントでは、ウィジェットの新しい幅を使用して省略されたテキストを作成し、テキストをリセットできるようです。QFontMetrics :: elidedTextメソッドを使用して、省略されたバージョンの文字列を取得します。

QString text("some long text without elipsis");
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, label->width());
label->setText(elidedText);

これがお役に立てば幸いです

于 2011-09-11T23:57:48.053 に答える
8

上記のソリューションを変更し、関数を作成しました。

static void SetTextToLabel(QLabel *label, QString text)
{
    QFontMetrics metrix(label->font());
    int width = label->width() - 2;
    QString clippedText = metrix.elidedText(text, Qt::ElideRight, width);
    label->setText(clippedText);
}

お役に立てば幸いです。

于 2012-02-28T08:11:44.010 に答える
1

Qt-5には、独自のラベルクラスを実装するときに役立つ参照となる可能性のある省略されたラベルクラスの例が含まれています。

例から:

elidedlabel.h:

class ElidedLabel : public QFrame
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText)
    Q_PROPERTY(bool isElided READ isElided)

public:
    explicit ElidedLabel(const QString &text, QWidget *parent = 0);

    void setText(const QString &text);
    const QString & text() const { return content; }
    bool isElided() const { return elided; }

protected:
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

signals:
    void elisionChanged(bool elided);

private:
    bool elided;
    QString content;
};

elidedlabel.cpp:

ElidedLabel::ElidedLabel(const QString &text, QWidget *parent)
    : QFrame(parent)
    , elided(false)
    , content(text)
{
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}

void ElidedLabel::setText(const QString &newText)
{
    content = newText;
    update();
}

void ElidedLabel::paintEvent(QPaintEvent *event)
{
    QFrame::paintEvent(event);

    QPainter painter(this);
    QFontMetrics fontMetrics = painter.fontMetrics();

    bool didElide = false;
    int lineSpacing = fontMetrics.lineSpacing();
    int y = 0;

    QTextLayout textLayout(content, painter.font());
    textLayout.beginLayout();
    forever {
        QTextLine line = textLayout.createLine();

        if (!line.isValid())
            break;

        line.setLineWidth(width());
        int nextLineY = y + lineSpacing;

        if (height() >= nextLineY + lineSpacing) {
            line.draw(&painter, QPoint(0, y));
            y = nextLineY;
            //! [2]
            //! [3]
        } else {
            QString lastLine = content.mid(line.textStart());
            QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width());
            painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine);
            line = textLayout.createLine();
            didElide = line.isValid();
            break;
        }
    }
    textLayout.endLayout();

    if (didElide != elided) {
        elided = didElide;
        emit elisionChanged(didElide);
    }
}
于 2017-06-20T11:13:09.023 に答える