QLabel点击和换行显示

QT中的QLabel是不可以点击的,如何添加点击事件?

可以考虑监听鼠标的左键点击事件,具体实现键下面代码

QT中的QLabel如何实现换行呢?

QLabel::setWordWrap(true);//但是如果数字或字母等都是无效的

考虑使用计算每个输入字符的宽度,然后和当前label的宽度比较,超过则换行,具体见下面代码

代码实现

头文件如下:

#ifndef CLICKABLEQLABEL_H
#define CLICKABLEQLABEL_H

#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
/**
 * @brief The ClickableQLabel class
 *
 * 支持QLabel点击,换行等功能。
 *
 * 注意:1,使用时在ui文件中将普通的QLabel提升为ClickableQLabel;
 *      2,如果wrapData或wrapDataContainLines换行无效,可能是由于设置的ClickableQLabel宽度不固定,可以尝试调整其固定长度解决
 *
 */
class ClickableQLabel : public QLabel
{
    Q_OBJECT
public:
    explicit ClickableQLabel(QWidget *parent = nullptr);
    /**
     * @brief wrapData 确认不会包含"\n"换行符时可以使用 ,也可以直接使用wrapDataContainLines
     * @param text 显示的文字
     * @param lines 最大的行数
     */
    void wrapData(const QString& text , int lines = 0);
    /**
     * @brief wrapDataContainLines 当text中可能包含换行符时使用这个setText
     * @param text 显示的文字
     * @param lines 最大行数
     */
    void wrapDataContainLines(const QString& text , int lines = 0);
protected:
    void mouseReleaseEvent(QMouseEvent *event);
private:
    QString spliteText(const QFontMetrics& font, const QString& text, int labelSize , int  & lines);

signals:
    /**
     * @brief clicked 点击的信号,给外界连接添加回调
     */
    void clicked();
public slots:
private:
    int maxLines_ = 0;
};

#endif // CLICKABLEQLABEL_H

cpp文件:

#include "clickableqlabel.h"
#include <qDebug>
ClickableQLabel::ClickableQLabel(QWidget *parent) : QLabel(parent)
{

}
void ClickableQLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    Q_UNUSED(ev)
    //监听鼠标的点击
    if(ev->button() == Qt::LeftButton)
    {
        emit clicked();	// 发射信号
    }
}
QString ClickableQLabel::spliteText(const QFontMetrics& font, const QString& text, int labelSize , int & lines)
{

    int textSize = font.width(text);
//    qDebug()<<"spliteText lines , textSize <<<<<"<<lines << " , " <<textSize << text;
    if(textSize > labelSize){
        int nPos = 0;
        long nOffset = 0;
        for (int i = 0; i < text.size(); i++){
            nOffset += font.width(text.at(i));
            if(nOffset >= labelSize){
                nPos = i;
                break;
            }
        }

        nPos = (nPos -1 < 0) ? 0 : nPos -1;

        QString strLeftData = text.left(nPos);
        QString strMidData = text.mid(nPos);
//        qDebug()<<"spliteText strLeftData >>>>>> "<<font.width(strLeftData) << " , " <<labelSize <<" ,strLeftData = " << strLeftData;
//        qDebug()<<"spliteText ********** "<<font.width(text.at(0)) ;
        if(lines < maxLines_){
           return strLeftData + "\n" + spliteText(font, strMidData, labelSize , ++lines);
        }else{
           return strLeftData.replace(strLeftData.size()-1,2,"...");//如果超过了规定的行数,最后一行后面添加...
        }
    }
    return text;
}

void ClickableQLabel::wrapData(const QString& text , int maxlines)
{
    maxLines_ = maxlines;
//    QLabel::setWordWrap(true);
    QFontMetrics font(this->font());
    int textSize = font.width(text);
    int labelSize = this->width();
    int num = 1;
    if(textSize > labelSize){
        QString qstrData = spliteText(font, text, labelSize , num);

        QLabel::setText(qstrData);
        return;
    }

    QLabel::setText(text);
}
void ClickableQLabel::wrapDataContainLines(const QString& text , int maxlines)
{
    if(!text.contains("\n")){
        return wrapData(text , maxlines);
    }

    maxLines_ = maxlines;
    QFontMetrics font(this->font());
    int textSize = 0;
    int labelSize = this->width();
    int tempLines = 1;
    QList<QString> list = text.split("\n");
    QString tempString;
    foreach (QString text, list) {
        textSize = font.width(text);
        if(textSize > labelSize){
            QString qstrData = spliteText(font, text, labelSize , tempLines);
            tempString.append(qstrData).append("\n");
        }else{
            tempLines++;
            if(tempLines < maxLines_){
               tempString.append(text).append("\n");
            }else{
               break;
            }
        }
    }
    if(tempString.contains("\n")){
        tempString.remove(tempString.size()-1,2);
    }
    foreach (QString text, tempString.split("\n")) {
//        qDebug()<<"wrapDataContainLines lxs text =  <<<<<"<<text;
    }

    QLabel::setText(tempString);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值