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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章