使用标签控件时我首先想到的就是QLabel,QLabel支持自动换行,并可以解析富文本,是一个不错的选择,这也使的我并没有去深入了解其他的可以有 同样效果的控件,本篇文字我也主要是讲解标签的用法,可以如果QLabel既然能满足我的需求了,我为什么还要写这篇文字呢,原因就如下:QLabel自 动换行时不可以把一个字分开,例如出现一个很长的字符串时,这样就出现两种情况,一种就是产生水平滚动条;另外一种就是文字有一部分看不到了基于以上问 题,我开始了寻找其他控件替代QLabel,首先我找到的就是QTextBrowser,这个类也基本上满足了在QLabel实现不了的功能,我自己封装 的类代码如下:

头文件

 class CLabelBrowser : public QTextBrowser

 {

 Q_OBJECT

 public:

 CLabelBrowser(QWidget * parent = nullptr, bool enbale = false);

 ~CLabelBrowser();

 public:

 void SetAutoHeight(bool enbale){ m_AutoHeight = enbale; }//设置行高是否随内容自动变化

 void ResetHeight();

 protected:

 virtual bool event(QEvent *) Q_DECL_OVERRIDE;

 virtual void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE;

 virtual void changeEvent(QEvent *) Q_DECL_OVERRIDE;

 private:

 bool m_AutoHeight = false;//自动行高,不显示滚动条

 };

​/对应实现文件

//QTextBrowser::anchorClicked:url被点击

//QTextBrowser::highlighted:鼠标移动到url上

 CLabelBrowser::CLabelBrowser(QWidget * parent, bool enable)

 : QTextBrowser(parent)

 , m_AutoHeight(enable)

 {

 setOpenLinks(false);//鼠标点击时,不跳转

 setContextMenuPolicy(Qt::NoContextMenu);//禁止右键菜单弹出

 connect(document(), &QTextDocument::contentsChanged, this, [this]{ ResetHeight(); });

 }

 CLabelBrowser::~CLabelBrowser()

 {}

 void CLabelBrowser::ResetHeight()

 {

 if (m_AutoHeight)

 {

 setFixedHeight(document()->size().rheight() + frameWidth() * );

 }

 }

 bool CLabelBrowser::event(QEvent * event)

 {

 if (event->type() == QEvent::Show)//控件首次显示时,设置其高度

 {

 ResetHeight();

 }

 return __super::event(event);;

 }

 void CLabelBrowser::resizeEvent(QResizeEvent * event)

 {

 ResetHeight();//控件大小改变时,设置其高度

 __super::resizeEvent(event);

 }

 void CLabelBrowser::changeEvent(QEvent * event) 

 {

 __super::changeEvent(event);

 }

以上代码不难理解,我只说下为什么这样做,为了让控件不出现垂直滚动条,我们需要实时修改控件的高度,修改高度的时机有这么几点:控件初次显示,控件大小发现变化,该类也提供了手动重置大小的接

为什么不在初始化的时候计算大小?答:因为初始化的时候控件的size拿不到实现效果如图1所示

图1 

如果不用支持长英文串换行,其实QLabel完全满足我的要求,实现效果如图2所示

下载链接:http://download.csdn.net/detail/qq_30392343/9581311

图2
 

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!
 

很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

最新文章

  1. 使用WatiN进行UI自动化测试
  2. php比较加赋值语句
  3. examine self thrice a day2016
  4. IDEA如何打包可运行jar的一个问题。
  5. applicationContext.xml详解(转)
  6. http调试工具,linux调试工具
  7. C++将一个数组内容赋给另一个数组
  8. 电铸3D18K硬金 电铸易熔合金 电铸中空硬金饰品合金
  9. Python 特殊方法
  10. 20181013xlVba年级报表拆分为班级报表
  11. vim 介绍安装 复制 剪切 粘贴
  12. Eclipse 不能build, pom文件上面有叉叉 解决办法
  13. C#如何调用R
  14. jsp+springmvc实现文件上传、图片上传和及时预览图片
  15. 使用 C++11 编写类似 QT 的信号槽——上篇
  16. ‘,’之后要留空格,如 Function(x, y, z)
  17. 人工智能(Machine Learning)—— 机器学习
  18. 嵌入式Linux系统移植——uboot常用命令
  19. Android -- Service绑定解绑和aidl
  20. VS和IE或者360兼容模式简单调试js方法

热门文章

  1. SeaJS之use方法
  2. oracle中可能使用到的命令
  3. 推荐一款免费的PDF转换工具 | PDFCandy
  4. 一小时学会ECMAScript6新特性(一)
  5. C#语言struct结构体适用场景和注意事项
  6. CMD 中常见命令
  7. Spring AOP Capabilities ang goals
  8. Analysis CDI
  9. Mysql 常见问题
  10. npm install命令详解