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