自定义自适应内容的Label

39 篇文章 0 订阅
头文件:
#ifndef ELIDEDLABEL_H
#define ELIDEDLABEL_H

#include <QFrame>
#include <QRect>
#include <QResizeEvent>
#include <QString>
#include <QWidget>

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

public:
    ElidedLabel(QWidget *parent = 0);

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

protected:
    void paintEvent(QPaintEvent *event);

signals:
    void elisionChanged(bool elided);

private:
    bool elided;
    QString content;
};

#endif // TEXTWRAPPINGWIDGET_H


源文件:

#include <QPainter>
#include <QTextLayout>
#include <QDebug>


ElidedLabel::ElidedLabel(QWidget *parent)
    : QFrame(parent)
    , elided(false)
{
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}

void ElidedLabel::setText(const QString &newText)
{
//    setToolTip(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;
        } 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);
    }
}
文本内容随着控件的大小改变,可获取改变前的文本。


下面附上改变文本长度的代码,适合各种控件:

QFont font(ui->_signIn->font());
QFontMetrics fm(font);
ui->_signIn->setText(fm.elidedText(QString(signIn.c_str()),
                                           Qt::ElideRight, ui->_signIn->width()));




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用QPixmap的scaled函数来调整图像大小,然后将其设置为QLabel的pixmap。在此过程中,您可以根据QLabel的大小计算出所需的图像大小。 以下是一个示例代码: ```python from PyQt5.QtWidgets import QApplication, QLabel, QWidget from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt class ImageLabel(QLabel): def __init__(self, parent=None): super().__init__(parent) self.setAlignment(Qt.AlignCenter) self.setStyleSheet("border: 1px solid black;") # 仅用于测试 def setPixmap(self, pixmap): super().setPixmap(self.scaledPixmap(pixmap)) def scaledPixmap(self, pixmap): size = self.size() if pixmap.width() > size.width() or pixmap.height() > size.height(): return pixmap.scaled(size, Qt.KeepAspectRatio, Qt.SmoothTransformation) return pixmap class MainWindow(QWidget): def __init__(self): super().__init__() self.resize(400, 400) image_label = ImageLabel(self) image_label.setGeometry(50, 50, 300, 300) pixmap = QPixmap("image.jpg") image_label.setPixmap(pixmap) app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个示例中,我们创建了一个名为ImageLabel自定义QLabel,并重写了它的setPixmap方法。在这个方法中,我们使用scaledPixmap方法来计算所需的图像大小,并使用QLabel的setPixmap方法来设置图像。 scaledPixmap方法检查图像是否比QLabel的大小大。如果是,则使用pixmap的scaled函数调整图像大小以适合QLabel。在这里,我们使用Qt.KeepAspectRatio和Qt.SmoothTransformation选项,以保持图像的宽高比并使用平滑的转换。 最后,我们在MainWindow中创建了一个ImageLabel,并设置了一个图像。您可以将其替换为您自己的图像路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值