سؤال

لقد حصلت على عنصر كلابيل في القطعة التي يمكن تغيير حجمها.النص يمكن تجاوز الحدود ، لذلك أنا بحاجة ، لتطبيق لتبدو أكثر أناقة ، بعض الطريق لجعل النص توليد القطع (...) بعد آخر كلمة مرئية تماما في النص.

جعل تخطيطات في هتمل / كس اعتدت على استخدام text-overflow: ellipsis; لهذا, ولكن لفئات كيو تي لم أجد أي معلومات عن هذا.

هل كانت مفيدة؟

المحلول

يبدو على الملصق الخاص بك تغيير حجم الحدث يمكنك إنشاء نص مسحوب باستخدام العرض الجديد للقطعة وإعادة تعيين النص.استخدام كفونتميتريكس:: إليدتكست طريقة للحصول على نسخة إلديد من السلسلة.

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

نأمل أن يساعد هذا ، التحيات

نصائح أخرى

لقد قمت بتعديل الحل الموصوف أعلاه وأنشأت وظيفة:

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

نأمل أن يكون مفيدا.

كيو تي - 5 يتضمن مثال على فئة التسمية المحذوفة والتي قد تكون مرجعا مفيدا عند تنفيذ الخاصة بك.

من المثال:

التسمية.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::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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top