• qt 标签 QTextBrowser QLabel


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

    头文件

     1 class CLabelBrowser : public QTextBrowser
     2 
     3 {
     4 
     5 Q_OBJECT
     6 
     7 public:
     8 
     9 CLabelBrowser(QWidget * parent = nullptr, bool enbale = false);
    10 
    11 ~CLabelBrowser();
    12 
    13 public:
    14 
    15 void SetAutoHeight(bool enbale){ m_AutoHeight = enbale; }//设置行高是否随内容自动变化
    16 
    17 void ResetHeight();
    18 
    19 protected:
    20 
    21 virtual bool event(QEvent *) Q_DECL_OVERRIDE;
    22 
    23 virtual void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE;
    24 
    25 virtual void changeEvent(QEvent *) Q_DECL_OVERRIDE;
    26 
    27 private:
    28 
    29 bool m_AutoHeight = false;//自动行高,不显示滚动条
    30 
    31 };
    View Code

    ​/对应实现文件

    //QTextBrowser::anchorClicked:url被点击

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

     1 CLabelBrowser::CLabelBrowser(QWidget * parent, bool enable)
     2 
     3 : QTextBrowser(parent)
     4 
     5 , m_AutoHeight(enable)
     6 
     7 {
     8 
     9 setOpenLinks(false);//鼠标点击时,不跳转
    10 
    11 setContextMenuPolicy(Qt::NoContextMenu);//禁止右键菜单弹出
    12 
    13 connect(document(), &QTextDocument::contentsChanged, this, [this]{ ResetHeight(); });
    14 
    15 }
    16 
    17 CLabelBrowser::~CLabelBrowser()
    18 
    19 {}
    20 
    21 void CLabelBrowser::ResetHeight()
    22 
    23 {
    24 
    25 if (m_AutoHeight)
    26 
    27 {
    28 
    29 setFixedHeight(document()->size().rheight() + frameWidth() * 2);
    30 
    31 }
    32 
    33 }
    34 
    35 bool CLabelBrowser::event(QEvent * event)
    36 
    37 {
    38 
    39 if (event->type() == QEvent::Show)//控件首次显示时,设置其高度
    40 
    41 {
    42 
    43 ResetHeight();
    44 
    45 }
    46 
    47 return __super::event(event);;
    48 
    49 }
    50 
    51 void CLabelBrowser::resizeEvent(QResizeEvent * event)
    52 
    53 {
    54 
    55 ResetHeight();//控件大小改变时,设置其高度
    56 
    57 __super::resizeEvent(event);
    58 
    59 }
    60 
    61 void CLabelBrowser::changeEvent(QEvent * event) 
    62 
    63 {
    64 
    65 __super::changeEvent(event);
    66 
    67 }
    View Code

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

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

    图1 

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

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

    图2
     

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

    很重要--转载声明

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

  • 相关阅读:
    读入优化
    poj 3216 Repairing Company
    poj 2594 Treasure Exploration
    poj 1419 Graph Coloring
    POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
    bzoj2007: [Noi2010]海拔
    bzoj4552: [Tjoi2016&Heoi2016]排序
    bzoj1041: [HAOI2008]圆上的整点
    oracle 的服务器进程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)
    undo表空间居高不下和enq: US
  • 原文地址:https://www.cnblogs.com/swarmbees/p/5621553.html
Copyright © 2020-2023  润新知