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