Qt C++带导航功能的ListView基础类封装2

山前大桥下,有一个傻瓜。一枚小学生,幽居荒山中。养了一群狗,还有一只猫。喜欢搞编程,缺钱打零工。数理史皆通,法文记心中。下厨会做饭,挥毫能舞文。


书接上一回,封装完导航窗口之后作者发现在ListView的使用中存在一个比较容易忽视的细节:当列表为空时列表区域空荡荡,为了更加友好的体验,这时候开发者就需要判断列表是否有数据,然后自行完成列表显示或隐藏 或者通过页面切换来实现一个空数据封面提醒。考虑到上述问题,为了增加良好的体验,作者在带导航的基础列表中增加了封面功能,用户只调用基础类的CheckDataDisplay函数即可实现展示封面或数据,这一切由列表基础类自动维护,不需要用户在写额外的代码。列表空数据封面类截图如下:

封面功能支持所有自定义,可自定义范围如下:

1、封面图片,为了适应高分屏笔者全部使用svg

2、封面标题

3、封面描述

4、自定义按钮,按钮个数在初始化时自行添加,Load Data是用户不传参初始化时自动设置的默认按钮,如果用户传参那么按钮将为用户自定义按钮。

5、按钮单击事件信号发出,支持自定义处理

封面功能除了空数据封面之外还封装了加载等待,当用户调用LoadingStarted时ListView基类会显示封面并切换到加载模式,加载模式中提供多种加载进度动画选择。

由于本篇主要针对之前ListView封装的延续,因此不在继续描述新功能,本篇中重点给出部分IndexNavList的基础类的基本功能封装

注意上面提到的封面功能 在当前文章中并未提供,有关详细可加入作者QQ群获取更多帮助。群号:717743458


列表风格数据结构体定义如下哈哈

/// 索引面板风格结构体
///
typedef struct LISTNAVIINDEX_STYLE_{
    QColor    cNaviPanelBkgd = Qt::transparent;       //导航条背景颜色
    QColor    cNavPaneBorder = QColor(66,66,66,66);   //导航条边框颜色
    double    dNavPaneRadius = 0.5;                   //导航条背景圆角比例
    uint      uNavPaneBorder = 0;                     //导航条边框宽度,0表示不显示边框
    uint      uNavBtnsBorder = 0;                     //导航条按钮边框宽度,0表示不显示边框
    uint      uNavButtonSize = 12;                    //导航按钮大小
    uint      uNavGridBnSize = 36;                    //窗格按钮大小
    uint      uNavBnFontSize = 7;                     //按钮文字大小
    uint      uNavGridFontSz = 13;                    //窗格按钮文字大小
    QColor    cNavBtnsBorder = QColor(66,66,66,66);   //导航按钮边框颜色
    QColor    cNavDisableFrm = QColor(99,99,99,66);   //导航条按钮禁用边框颜色
    QColor    cNavBtnBkgClrs = QColor(44,44,44,44);   //导航按钮背景色
    QColor    cNavBtnTxtClrs = QColor(44,44,44);      //导航按钮文字色
    QColor    cNavBtnBgHover = QColor(111,131,219);   //导航按钮悬停背景色
    QColor    cNavBtnDisable = QColor(99,99,99,44);   //导航按钮禁用背景色
    QColor    cNavTextHovers = QColor(255,255,255);   //导航按钮悬停文字颜色
    QColor    cNavBtnsSelect = QColor(250,93,51);     //导航按钮悬停背景色
    QColor    cNavTextSelect = QColor(255,255,255);   //导航按钮悬停文字颜色
    QColor    cNavTxtDisable = QColor(127,127,127);    //导航按钮禁用文字色
    double    dNavBtnsRadius = 0.5;                   //导航条按钮圆角比例
    uint      uDockAlignment = 1;                     //停靠位置,0左,1右
    bool      bHasAlwaysShow = true;                  //总是显示导航条,如果为false则鼠标移动到边缘时才显示
    uint      uNavTipsFtSize = 12;                    //导航提示字体大小
    uint      uNavPaddingVal = 2;                     //导航条水平边距

    //SetNavPanelStyle函数不会修改下面的属性,若要修改下面的属性请使用单独的函数

    double    dNavTipsRadius;                         //导航提示圆角比例,0-0.5。0
    QColor    cNavTipBkgClrs;                         //导航提示背景色
    QColor    cNavTipsArrows;                         //导航提示箭头背景色
    QColor    cNavTipsColors;                         //导航提示文字颜色

    bool operator == (const LISTNAVIINDEX_STYLE_& rhs) // != 操作运算符重载
    {
        //代码省略
    }

    bool operator != (const LISTNAVIINDEX_STYLE_& rhs) // != 操作运算符重载
    {
        return !(*this == rhs);
    }

列表头文件定义如下:

class Lncf_NavIndexPanel;
class Lncf_NavIndexGrids;
class Lncf_DataNullCover;
class LNCF_QTSOCIALLIBS_API Lncf_IndexNavListv : public QListView
{
    Q_OBJECT
    //属性定义省略
public:
    explicit Lncf_IndexNavListv(QWidget *parent = nullptr);
    ~Lncf_IndexNavListv();
public:
    /// 初始化列表虚函数
    /// \brief InitNavBaseList
    /// \param bGrid     :是否使用窗格导航,默认为垂直导航条
    /// \param bShowNav  :是否显示导航,在垂直导航条模式时控制是否总是显示
    ///
    virtual void InitNavBaseList(bool bGrid =false,bool bShowNav=true);

    /// 更改导航风格
    /// \brief ChangeNavStyles
    /// \param bGrid
    ///
    void ChangeNavStyles(const bool bGrid);

protected:
    /// 重写系统显示事件
    /// \brief showEvent
    /// \param event
    ///
    void showEvent(QShowEvent *event) override;

    /// 重写系统大小改变事件
    void resizeEvent(QResizeEvent *event) override;

    /// 重写系统鼠标移动事件
    /// \brief mouseMoveEvent
    /// \param event
    ///
    void mouseMoveEvent(QMouseEvent *event) override;

    /// 更新导航条位置
    /// \brief UpdateNavPanelPos
    ///
    void UpdateNavPanelPos();
public:
    virtual void setModel(QAbstractItemModel *model) override;
private:
    // 导航栏控件
    Lncf_NavIndexPanel *pPanelNavIndex = nullptr;
    Lncf_NavIndexGrids *pGridsNavIndex = nullptr;

    // 封面部件
    Lncf_DataNullCover *pCoversWidgets = nullptr;

    bool                bHasFristsShow = true;

    bool                bShowNaviPanel = true;

    bool                bGridNaviStyle = false;//是否使用窗格导航面板,默认是垂直条

    bool                bDataDisplayed = false;//数据是否显示

    LISTNAVIINDEX_STYLE tNavPanelStyle;

public:

    /// 获取导航面板风格数据结构
    /// \brief GetNavPanelStyle
    /// \return
    ///
    LISTNAVIINDEX_STYLE GetNavPanelStyle() const;

    /// 获取是否为表格导航
    /// \brief GetGridNaviStyle
    /// \return
    ///
    bool GetGridNaviStyle() const;

    /// 获取导航条背景颜色
    /// \brief GetNaviPanelBkgd
    /// \return
    ///
    QColor GetNaviPanelBkgd() const;

    /// 获取导航条边框颜色
    /// \brief GetNavBorderClrs
    /// \return
    ///
    QColor GetNavBorderClrs() const;

    /// 获取导航条背景圆角比例
    /// \brief GetNavPaneRadius
    /// \return
    ///
    double GetNavPaneRadius() const;

    /// 获取导航条边框宽度,0表示不显示边框
    /// \brief GetNavPaneBorderWide
    /// \return
    ///
    uint GetNavPaneBorderWide() const;

    /// 获取导航条按钮边框宽度,0表示不显示边框
    /// \brief GetNavBtnsBorderWide
    /// \return
    ///
    uint GetNavBtnsBorderWide() const;

    /// 获取导航按钮大小
    /// \brief GetNavButtonSize
    /// \return
    ///
    uint GetNavButtonSize() const;

    /// 获取窗格按钮大小
    /// \brief GetNavGridBnSize
    /// \return
    ///
    uint GetNavGridBnSize() const;

    /// 获取按钮文字大小
    /// \brief GetNavBnFontSize
    /// \return
    ///
    uint GetNavBnFontSize() const;

    /// 获取窗格按钮文字大小
    /// \brief GetNavGridFontSz
    /// \return
    ///
    uint GetNavGridFontSz() const;

    /// 获取导航条边框颜色
    /// \brief GetNavBtnsBorderClrs
    /// \return
    ///
    QColor GetNavBtnsBorder() const;

    /// 获取导航按钮背景色
    /// \brief GetNavBtnBkgClrs
    /// \return
    ///
    QColor GetNavBtnBkgClrs() const;

    /// 获取导航按钮文字色
    /// \brief GetNavBtnTxtClrs
    /// \return
    ///
    QColor GetNavBtnTxtClrs() const;

    /// 获取导航按钮悬停背景色
    /// \brief GetNavBtnBgHover
    /// \return
    ///
    QColor GetNavBtnBgHover() const;

    /// 获取导航按钮悬停文字颜色
    /// \brief GetNavTextHovers
    /// \return
    ///
    QColor GetNavTextHovers() const;

    /// 获取导航按钮悬停背景色
    /// \brief GetNavBtnsSelect
    /// \return
    ///
    QColor GetNavBtnsSelect() const;

    /// 获取导航按钮悬停文字颜色
    /// \brief GetNavTextSelect
    /// \return
    ///
    QColor GetNavTextSelect() const;

    /// 获取导航条按钮圆角比例
    /// \brief GetNavBtnsRadius
    /// \return
    ///
    double GetNavBtnsRadius() const;

    /// 获取停靠位置,0左,1右
    /// \brief GetDockAlignment
    /// \return
    ///
    uint GetDockAlignment() const;

    /// 获取总是显示导航条,如果为false则鼠标移动到边缘时才显示
    /// \brief GetHasAlwaysShow
    /// \return
    ///
    bool GetHasAlwaysShow() const;

    /// 获取导航条水平边距
    /// \brief GetNavPaddingVal
    /// \return
    ///
    uint GetNavPaddingVal() const;

    /// 获取导航字符索引
    /// \brief GetNaviTextsList
    /// \return
    ///
    QList<std::u16string> GetNaviTextsList() const;

    //SetNavPanelStyle函数不会修改下面的属性,若要修改下面的属性请使用单独的函数

    /// 获取导航提示字体大小
    /// \brief GetNavTipsFtSize
    /// \return
    ///
    uint GetNavTipsFtSize() const;

    /// 获取导航提示圆角比例,0-0.5。0
    /// \brief GetNavTipsRadius
    /// \return
    ///
    double GetNavTipsRadius() const;

    /// 获取导航提示背景色
    /// \brief GetNavTipBkgClrs
    /// \return
    ///
    QColor GetNavTipBkgClrs() const;

    /// 获取导航提示箭头背景色
    /// \brief GetNavTipsArrows
    /// \return
    ///
    QColor GetNavTipsArrows() const;

    /// 获取导航提示文字颜色
    /// \brief GetNavTipsColors
    /// \return
    ///
    QColor GetNavTipsColors() const;

    /// 获取是否显示提醒
    /// \brief GetIsShowTooltip
    /// \return
    ///
    bool GetIsShowTooltip() const;

    /// 获取垂直导航条显示属性
    /// \brief GetShowNaviPanel
    /// \return
    ///
    bool GetShowNaviPanel() const;
public slots:

    /// 设置导航按钮启用状态
    /// \brief SetNaviBtnEnable
    /// \param uIndex
    /// \param bEnable
    ///
    void SetNaviBtnEnable(uint uIndex,bool bEnable);

    /// 设置索引导航风格
    /// \brief SetNavPanelStyle
    /// \param tStyle
    ///
    void SetNavPanelStyle(LISTNAVIINDEX_STYLE tStyle);

    /// 设置导航条背景颜色
    /// \brief SetNaviPanelBkgd
    /// \param cValue
    ///
    void SetNaviPanelBkgd(const QColor cValue);

    /// 设置导航条边框颜色
    /// \brief SetNavPaneBorder
    /// \param cValue
    ///
    void SetNavPaneBorder(const QColor cValue);

    /// 设置导航条背景圆角比例
    /// \brief SetNavPaneRadius
    /// \param dValue
    ///
    void SetNavPaneRadius(const double dValue);

    /// 设置导航条边框宽度,0表示不显示边框
    /// \brief SetNavPaneBorderWide
    /// \param nValue 边框宽度,边框不能太宽,不能超过4
    ///
    void SetNavPaneBorderWide(const uint nValue);

    /// 设置导航条按钮边框宽度,0表示不显示边框
    /// \brief SetNavBtnsBorderWide
    /// \param nValue
    ///
    void SetNavBtnsBorderWide(const uint nValue);

    /// 设置导航按钮大小
    /// \brief SetNavButtonSize
    /// \param nValue
    ///
    void SetNavButtonSize(const uint nValue);

    /// 设置窗格按钮大小
    /// \brief SetNavGridBnSize
    /// \param nValue
    ///
    void SetNavGridBnSize(const uint nValue);

    /// 设置按钮文字大小
    /// \brief SetNavBnFontSize
    /// \param nValue
    ///
    void SetNavBnFontSize(const uint nValue);

    /// 设置窗格按钮文字大小
    /// \brief SetNavGridFontSz
    /// \param nValue
    ///
    void SetNavGridFontSz(const uint nValue);

    /// 设置导航条边框颜色
    /// \brief SetNavBtnsBorder
    /// \param cValue
    ///
    void SetNavBtnsBorder(const QColor cValue);

    /// 设置导航按钮背景色
    /// \brief SetNavBtnBkgClrs
    /// \param cValue
    ///
    void SetNavBtnBkgClrs(const QColor cValue);

    /// 设置导航按钮文字色
    /// \brief SetNavBtnTxtClrs
    /// \param cValue
    ///
    void SetNavBtnTxtClrs(const QColor cValue);

    /// 设置导航按钮悬停背景色
    /// \brief SetNavBtnBgHover
    /// \param cValue
    ///
    void SetNavBtnBgHover(const QColor cValue);

    /// 设置导航按钮悬停文字颜色
    /// \brief SetNavTextHovers
    /// \param cValue
    ///
    void SetNavTextHovers(const QColor cValue);

    /// 设置导航按钮悬停背景色
    /// \brief SetNavBtnsSelect
    /// \param cValue
    ///
    void SetNavBtnsSelect(const QColor cValue);

    /// 设置导航按钮悬停文字颜色
    /// \brief SetNavTextSelect
    /// \param cValue
    ///
    void SetNavTextSelect(const QColor cValue);

    /// 设置导航条按钮圆角比例
    /// \brief SetNavBtnsRadius
    /// \param dValue
    ///
    void SetNavBtnsRadius(const double dValue);

    /// 设置停靠位置,0左,1右
    /// \brief SetDockAlignment
    /// \param nValue
    ///
    void SetDockAlignment(const uint nValue);

    /// 设置总是显示导航条,如果为false则鼠标移动到边缘时才显示
    /// \brief SetHasAlwaysShow
    /// \param bValue
    ///
    void SetHasAlwaysShow(const bool bValue);

    /// 设置导航条水平边距
    /// \brief SetNavPaddingVal
    /// \param uValue
    ///
    void SetNavPaddingVal(const uint uValue);

    /// 设置导航字符索引,不能小于29个,超过29个将不会被显示
    /// \brief SetNaviTextsList
    /// \param sList
    ///
    void SetNaviTextsList(QList<std::u16string> sList);

    //SetNavPanelStyle函数不会修改下面的属性,若要修改下面的属性请使用单独的函数

    /// 设置导航提示字体大小
    /// \brief SetNavTipsFtSize
    /// \param nValue
    ///
    void SetNavTipsFtSize(const uint nValue);

    /// 设置导航提示圆角比例,0-0.5。0
    /// \brief SetNavTipsRadius
    /// \param dValue
    ///
    void SetNavTipsRadius(const double dValue);

    /// 设置导航提示背景色
    /// \brief SetNavTipBkgClrs
    /// \param cValue
    ///
    void SetNavTipBkgClrs(const QColor cValue);

    /// 设置导航提示箭头背景色
    /// \brief SetNavTipsArrows
    /// \param cValue
    ///
    void SetNavTipsArrows(const QColor cValue);

    /// 设置导航提示文字颜色
    /// \brief SetNavTipsColors
    /// \param cValue
    ///
    void SetNavTipsColors(const QColor cValue);

    /// 设置是否显示导航提醒
    /// \brief SetIsShowTooltip
    /// \param bValue
    ///
    void SetIsShowTooltip(const bool &bValue);

    /// 设置导航索引选中
    /// \brief SetNavIndexCheck
    /// \param uIndex
    ///
    void SetNavIndexCheck(const uint uIndex,const bool bShowGrid=false);

    /// 导航索引被选中
    /// \brief NaviIndexChecked
    /// \param uIndex
    ///
    virtual void NaviIndexChecked(const uint uIndex);

    /// 设置垂直导航条显示属性
    /// \brief SetShowNaviPanel
    /// \param bValue
    ///
    void SetShowNaviPanel(const bool bValue);
signals:
    /// 按钮选中事件
    /// \brief NavBtnCheckEvts
    /// \param uIndex :选中的按钮索引0表示所有#按钮,1-26表示字母A到Z,27=数字按钮
    ///
    void NavBtnCheckEvts(const uint uIndex);

列表基础类部分实现代码如下:

 Lncf_IndexNavListv::Lncf_IndexNavListv(QWidget *parent)
    :QListView(parent)
  {
  }

  Lncf_IndexNavListv::~Lncf_IndexNavListv()
  {
    if(pCoversWidgets)
      delete pCoversWidgets;
  }

  /// 初始化列表虚函数
  /// \brief InitNavBaseList
  /// \param bGrid
  /// \param bShowNav
  ///
  void Lncf_IndexNavListv::InitNavBaseList(bool bGrid,bool bShowNav)
  {
    bGridNaviStyle = bGrid;
    if(!bGridNaviStyle){
        pPanelNavIndex = new Lncf_NavIndexPanel(this,tNavPanelStyle.uDockAlignment);
        pPanelNavIndex->setObjectName("navPanel");
        pPanelNavIndex->SetDockAlignment(tNavPanelStyle.uDockAlignment);
        connect(pPanelNavIndex, &Lncf_NavIndexPanel::NavBtnCheckEvts,this, &Lncf_IndexNavListv::NaviIndexChecked);
        bShowNaviPanel = bShowNav;
      }
    else{
        pGridsNavIndex = new Lncf_NavIndexGrids(this);
        pGridsNavIndex->setObjectName("navGrids");
        connect(pGridsNavIndex, &Lncf_NavIndexGrids::NavBtnCheckEvts,this, &Lncf_IndexNavListv::NaviIndexChecked);
      }

    this->setMouseTracking(true);
    SetNavPanelStyle(tNavPanelStyle);
  }

  /// 更改导航风格
  /// \brief ChangeNavStyles
  /// \param bGrid
  ///
  void Lncf_IndexNavListv::ChangeNavStyles(const bool bGrid)
  {
    if(bGridNaviStyle!=bGrid)
      {
        bGridNaviStyle =bGrid;
        if(bGridNaviStyle){
            if(pPanelNavIndex)pPanelNavIndex->hide();
            if(!pGridsNavIndex){
                pGridsNavIndex = new Lncf_NavIndexGrids(this);
                pGridsNavIndex->setObjectName("navGrids");
                connect(pGridsNavIndex, &Lncf_NavIndexGrids::NavBtnCheckEvts,this, &Lncf_IndexNavListv::NaviIndexChecked);
                pGridsNavIndex->hide();
              }
            SetNavPanelStyle(tNavPanelStyle);
          }
        else{
            if(pGridsNavIndex)pGridsNavIndex->hide();
            if(!pPanelNavIndex)
              {
                pPanelNavIndex = new Lncf_NavIndexPanel(this,tNavPanelStyle.uDockAlignment);
                pPanelNavIndex->setObjectName("navPanel");
                pPanelNavIndex->SetDockAlignment(tNavPanelStyle.uDockAlignment);
                connect(pPanelNavIndex, &Lncf_NavIndexPanel::NavBtnCheckEvts,this, &Lncf_IndexNavListv::NaviIndexChecked);

                if(tNavPanelStyle.uDockAlignment==0)
                  pPanelNavIndex->move(this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
                else
                  pPanelNavIndex->move(this->width()-pPanelNavIndex->width()-this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
                if(bShowNaviPanel&&bDataDisplayed)
                  pPanelNavIndex->show();
                else pPanelNavIndex->hide();
              }
            SetNavPanelStyle(tNavPanelStyle);
          }
        UpdateNavPanelPos();
      }
  }

  /// 重写系统显示事件
  /// \brief showEvent
  /// \param event
  ///
  void Lncf_IndexNavListv::showEvent(QShowEvent *event)
  {
    if(bHasFristsShow)
      {
        if(!bGridNaviStyle){
            if(tNavPanelStyle.uDockAlignment==0)
              pPanelNavIndex->move(this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            else
              pPanelNavIndex->move(this->width()-pPanelNavIndex->width()-this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            if(bShowNaviPanel&&bDataDisplayed)
              pPanelNavIndex->show();
            else pPanelNavIndex->hide();
          }
        else{
            if(pGridsNavIndex){
                pGridsNavIndex->move(0,0);
                pGridsNavIndex->resize(this->size());
                pGridsNavIndex->hide();
              }
          }
        bHasFristsShow = false;
      }
    QListView::showEvent(event);
  }

  /// 重写系统大小改变事件
  void Lncf_IndexNavListv::resizeEvent(QResizeEvent *event)
  {
    UpdateNavPanelPos();
    QListView::resizeEvent(event);
  }

  /// 重写系统鼠标移动事件
  /// \brief mouseMoveEvent
  /// \param event
  ///
  void Lncf_IndexNavListv::mouseMoveEvent(QMouseEvent *event)
  {
    if(event&&pPanelNavIndex)
      {
        if(!pPanelNavIndex->underMouse()){
            pPanelNavIndex->HideTooltipFrame();
          }
      }
    return QListView::mouseMoveEvent(event);
  }

  /// 更新导航条位置
  /// \brief UpdateNavPanelPos
  ///
  void Lncf_IndexNavListv::UpdateNavPanelPos()
  {
    if(!bGridNaviStyle){
        if(tNavPanelStyle.uDockAlignment==0&&pPanelNavIndex){
            if(pPanelNavIndex)
              pPanelNavIndex->move(this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
          }
        else
          if(pPanelNavIndex)
            pPanelNavIndex->move(this->width()-pPanelNavIndex->width()-this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
      }
    else{
        if(pGridsNavIndex){
            pGridsNavIndex->move(0,0);
            pGridsNavIndex->resize(this->size());
          }
      }
  }

  void Lncf_IndexNavListv::setModel(QAbstractItemModel *model)
  {
    return QListView::setModel(model);
  }

  /// 获取封面对象指针
  /// 说明:如果要设置封面对象风格和操作封面接口请使用此接口访问
  /// \brief GetCoversWidgets
  /// \return
  ///
  Lncf_DataNullCover *Lncf_IndexNavListv::GetCoversWidgets() const
  {
    return this->pCoversWidgets;
  }

  /// 获取控件信息
  /// \brief GetSocialCtlInfo
  /// \return
  ///
  LNCFQT_SOCIALCTL_INF Lncf_IndexNavListv::GetSocialCtlInfo()
  {
    return {typeid (this).name(),tr("Social Navigate Index ListView Control")};
  }

  /// 获取导航面板风格数据结构
  /// \brief GetNavPanelStyle
  /// \return
  ///
  LISTNAVIINDEX_STYLE Lncf_IndexNavListv::GetNavPanelStyle() const
  {
    return this->tNavPanelStyle;
  }

  /// 获取是否为表格导航
  /// \brief GetGridNaviStyle
  /// \return
  ///
  bool Lncf_IndexNavListv::GetGridNaviStyle() const
  {
    return this->bGridNaviStyle;
  }

  /// 获取导航条背景颜色
  /// \brief GetNaviPanelBkgd
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNaviPanelBkgd() const
  {
    return this->tNavPanelStyle.cNaviPanelBkgd;
  }

  /// 获取导航条边框颜色
  /// \brief GetNavBorderClrs
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBorderClrs() const
  {
    return this->tNavPanelStyle.cNavPaneBorder;
  }

  /// 获取导航条背景圆角比例
  /// \brief GetNavPaneRadius
  /// \return
  ///
  double Lncf_IndexNavListv::GetNavPaneRadius() const
  {
    return this->tNavPanelStyle.dNavPaneRadius;
  }

  /// 获取导航条边框宽度,0表示不显示边框
  /// \brief GetNavPaneBorderWide
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavPaneBorderWide() const
  {
    return this->tNavPanelStyle.uNavPaneBorder;
  }

  /// 获取导航条按钮边框宽度,0表示不显示边框
  /// \brief GetNavBtnsBorderWide
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavBtnsBorderWide() const
  {
    return this->tNavPanelStyle.uNavBtnsBorder;
  }

  /// 获取导航按钮大小
  /// \brief GetNavButtonSize
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavButtonSize() const
  {
    return this->tNavPanelStyle.uNavButtonSize;
  }

  /// 获取窗格按钮大小
  /// \brief GetNavGridBnSize
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavGridBnSize() const
  {
    return this->tNavPanelStyle.uNavGridBnSize;
  }

  /// 获取按钮文字大小
  /// \brief GetNavBnFontSize
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavBnFontSize() const
  {
    return this->tNavPanelStyle.uNavBnFontSize;
  }

  /// 获取窗格按钮文字大小
  /// \brief GetNavGridFontSz
  /// \return
  ///
  uint Lncf_IndexNavListv::GetNavGridFontSz() const
  {
    return this->tNavPanelStyle.uNavGridFontSz;
  }

  /// 获取导航条边框颜色
  /// \brief GetNavBtnsBorderClrs
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBtnsBorder() const
  {
    return this->tNavPanelStyle.cNavBtnsBorder;
  }

  /// 获取导航按钮背景色
  /// \brief GetNavBtnBkgClrs
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBtnBkgClrs() const
  {
    return this->tNavPanelStyle.cNavBtnBkgClrs;
  }

  /// 获取导航按钮文字色
  /// \brief GetNavBtnTxtClrs
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBtnTxtClrs() const
  {
    return this->tNavPanelStyle.cNavBtnTxtClrs;
  }

  /// 获取导航按钮悬停背景色
  /// \brief GetNavBtnBgHover
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBtnBgHover() const
  {
    return this->tNavPanelStyle.cNavBtnBgHover;
  }

  /// 获取导航按钮悬停文字颜色
  /// \brief GetNavTextHovers
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavTextHovers() const
  {
    return this->tNavPanelStyle.cNavTextHovers;
  }

  /// 获取导航按钮悬停背景色
  /// \brief GetNavBtnsSelect
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavBtnsSelect() const
  {
    return this->tNavPanelStyle.cNavBtnsSelect;
  }

  /// 获取导航按钮悬停文字颜色
  /// \brief GetNavTextSelect
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavTextSelect() const
  {
    return this->tNavPanelStyle.cNavTextSelect;
  }

  /// 获取导航条按钮圆角比例
  /// \brief GetNavBtnsRadius
  /// \return
  double Lncf_IndexNavListv::GetNavBtnsRadius() const
  {
    return this->tNavPanelStyle.dNavBtnsRadius;
  }

  /// 获取停靠位置,0左,1右
  /// \brief GetDockAlignment
  /// \return
  ///
  uint Lncf_IndexNavListv::GetDockAlignment() const
  {
    return this->tNavPanelStyle.uDockAlignment;
  }

  /// 获取总是显示导航条,如果为false则鼠标移动到边缘时才显示
  /// \brief GetHasAlwaysShow
  /// \return
  ///
  bool Lncf_IndexNavListv::GetHasAlwaysShow() const
  {
    return this->tNavPanelStyle.bHasAlwaysShow;
  }


  /// 获取导航提示箭头背景色
  /// \brief GetNavTipsArrows
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavTipsArrows() const
  {
    return pPanelNavIndex?pPanelNavIndex->GetTipArrowsBkg():this->tNavPanelStyle.cNavTipsArrows;
  }

  /// 获取导航提示文字颜色
  /// \brief GetNavTipsColors
  /// \return
  ///
  QColor Lncf_IndexNavListv::GetNavTipsColors() const
  {
    return pPanelNavIndex?pPanelNavIndex->GetTipsColorVal():this->tNavPanelStyle.cNavTipsColors;
  }

  /// 获取是否显示提醒
  /// \brief GetIsShowTooltip
  /// \return
  ///
  bool Lncf_IndexNavListv::GetIsShowTooltip() const
  {
    return pPanelNavIndex?pPanelNavIndex->GetIsShowTooltip():false;
  }

  /// 获取垂直导航条显示属性
  /// \brief GetShowNaviPanel
  /// \return
  ///
  bool Lncf_IndexNavListv::GetShowNaviPanel() const
  {
    return this->bShowNaviPanel;
  }


  /// 设置导航按钮启用状态
  /// \brief SetNaviBtnEnable
  /// \param uIndex
  /// \param bEnable
  ///
  void Lncf_IndexNavListv::SetNaviBtnEnable(uint uIndex,bool bEnable)
  {
    if(bGridNaviStyle)
      return pGridsNavIndex?pGridsNavIndex->SetNaviBtnEnable(uIndex,bEnable):void();
    else
      return pPanelNavIndex?pPanelNavIndex->SetNaviBtnEnable(uIndex,bEnable):void();
  }

  /// 设置索引导航风格
  /// \brief SetNavPanelStyle
  /// \param tStyle
  ///
  void Lncf_IndexNavListv::SetNavPanelStyle(LISTNAVIINDEX_STYLE tStyle)
  {
    //TODO:
    //导航面板风格设置
  }

  /// 设置导航条背景颜色
  /// \brief SetNaviPanelBkgd
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNaviPanelBkgd(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNaviPanelBkgd!=cValue){
        this->tNavPanelStyle.cNaviPanelBkgd = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条边框颜色
  /// \brief SetNavPaneBorder
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavPaneBorder(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavPaneBorder!=cValue){
        this->tNavPanelStyle.cNavPaneBorder = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条背景圆角比例
  /// \brief SetNavPaneRadius
  /// \param dValue
  ///
  void Lncf_IndexNavListv::SetNavPaneRadius(const double dValue)
  {
    if(this->tNavPanelStyle.dNavPaneRadius!=dValue&&dValue>-0.001&&dValue<0.501){
        this->tNavPanelStyle.dNavPaneRadius = dValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条边框宽度,0表示不显示边框
  /// \brief SetNavPaneBorderWide
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavPaneBorderWide(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavPaneBorder!=nValue&&nValue>=0&&nValue<4){
        this->tNavPanelStyle.uNavPaneBorder = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条按钮边框宽度,0表示不显示边框
  /// \brief SetNavBtnsBorder
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavBtnsBorderWide(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavBtnsBorder!=nValue&&nValue>=0&&nValue<4){
        this->tNavPanelStyle.uNavBtnsBorder = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮大小
  /// \brief SetNavButtonSize
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavButtonSize(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavButtonSize!=nValue){
        this->tNavPanelStyle.uNavButtonSize = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置窗格按钮大小
  /// \brief SetNavGridBnSize
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavGridBnSize(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavGridBnSize!=nValue){
        this->tNavPanelStyle.uNavGridBnSize = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置按钮文字大小
  /// \brief SetNavBnFontSize
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavBnFontSize(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavBnFontSize!=nValue){
        this->tNavPanelStyle.uNavBnFontSize = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置窗格按钮文字大小
  /// \brief SetNavGridFontSz
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavGridFontSz(const uint nValue)
  {
    if(this->tNavPanelStyle.uNavGridFontSz!=nValue){
        this->tNavPanelStyle.uNavGridFontSz = nValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条边框颜色
  /// \brief SetNavBtnsBorder
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavBtnsBorder(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavBtnsBorder!=cValue){
        this->tNavPanelStyle.cNavBtnsBorder = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮背景色
  /// \brief SetNavBtnBkgClrs
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavBtnBkgClrs(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavBtnBkgClrs!=cValue){
        this->tNavPanelStyle.cNavBtnBkgClrs = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮文字色
  /// \brief SetNavBtnTxtClrs
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavBtnTxtClrs(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavBtnTxtClrs!=cValue){
        this->tNavPanelStyle.cNavBtnTxtClrs = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮悬停背景色
  /// \brief SetNavBtnBgHover
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavBtnBgHover(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavBtnBgHover!=cValue){
        this->tNavPanelStyle.cNavBtnBgHover = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮悬停文字颜色
  /// \brief SetNavTextHovers
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavTextHovers(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavTextHovers!=cValue){
        this->tNavPanelStyle.cNavTextHovers = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮悬停背景色
  /// \brief SetNavBtnsSelect
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavBtnsSelect(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavBtnsSelect!=cValue){
        this->tNavPanelStyle.cNavBtnsSelect = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航按钮悬停文字颜色
  /// \brief SetNavTextSelect
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavTextSelect(const QColor cValue)
  {
    if(this->tNavPanelStyle.cNavTextSelect!=cValue){
        this->tNavPanelStyle.cNavTextSelect = cValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置导航条按钮圆角比例
  /// \brief SetNavBtnsRadius
  /// \param dValue
  ///
  void Lncf_IndexNavListv::SetNavBtnsRadius(const double dValue)
  {
    if(this->tNavPanelStyle.dNavBtnsRadius!=dValue){
        this->tNavPanelStyle.dNavBtnsRadius = dValue;
        SetNavPanelStyle(this->tNavPanelStyle);
      }
  }

  /// 设置停靠位置,0左,1右
  /// \brief SetDockAlignment
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetDockAlignment(const uint nValue)
  {
    if(this->tNavPanelStyle.uDockAlignment!=nValue){
        this->tNavPanelStyle.uDockAlignment = nValue;
        if(!bGridNaviStyle){
            if(pPanelNavIndex)pPanelNavIndex->SetDockAlignment(nValue);

            if(tNavPanelStyle.uDockAlignment==0)
              pPanelNavIndex->move(this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            else
              pPanelNavIndex->move(this->width()-pPanelNavIndex->width()-this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            if(bShowNaviPanel&&bDataDisplayed)
              pPanelNavIndex->show();
            else  pPanelNavIndex->hide();
          }
      }
  }

  /// 设置总是显示导航条,如果为false则鼠标移动到边缘时才显示
  /// \brief SetHasAlwaysShow
  /// \param bValue
  ///
  void Lncf_IndexNavListv::SetHasAlwaysShow(const bool bValue)
  {
    if(this->tNavPanelStyle.bHasAlwaysShow!=bValue){
        this->tNavPanelStyle.bHasAlwaysShow = bValue;
      }
  }

  /// 设置导航条水平边距
  /// \brief SetNavPaddingVal
  /// \param uValue
  ///
  void Lncf_IndexNavListv::SetNavPaddingVal(const uint uValue)
  {
    if(this->tNavPanelStyle.uNavPaddingVal!=uValue){
        this->tNavPanelStyle.uNavPaddingVal = uValue;
        if(!bGridNaviStyle){
            if(tNavPanelStyle.uDockAlignment==0)
              pPanelNavIndex->move(this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            else
              pPanelNavIndex->move(this->width()-pPanelNavIndex->width()-this->tNavPanelStyle.uNavPaddingVal,this->height()/2-pPanelNavIndex->height()/2);
            if(bShowNaviPanel&&bDataDisplayed)
              pPanelNavIndex->show();
            else  pPanelNavIndex->hide();
          }
      }
  }

  /// 设置导航字符索引,不能小于29个,超过29个将不会被显示
  /// \brief SetNaviTextsList
  /// \param sList
  ///
  void Lncf_IndexNavListv::SetNaviTextsList(QList<std::u16string> sList)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetNaviTextsList(sList);
    if(pGridsNavIndex)
      pGridsNavIndex->SetNaviTextsList(sList);
  }

  //SetNavPanelStyle函数不会修改下面的属性,若要修改下面的属性请使用单独的函数

  /// 设置导航提示字体大小
  /// \brief SetNavTipsFtSize
  /// \param nValue
  ///
  void Lncf_IndexNavListv::SetNavTipsFtSize(const uint nValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetTipsFontSize(nValue);
  }

  /// 设置导航提示圆角比例,0-0.5。0
  /// \brief SetNavTipsRadius
  /// \param dValue
  ///
  void Lncf_IndexNavListv::SetNavTipsRadius(const double dValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetTipRadiusVal(dValue);
  }

  /// 设置导航提示背景色
  /// \brief SetNavTipBkgClrs
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavTipBkgClrs(const QColor cValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetTipsBkgColor(cValue);
  }

  /// 设置导航提示箭头背景色
  /// \brief SetNavTipsArrows
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavTipsArrows(const QColor cValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetTipArrowsBkg(cValue);
  }

  /// 设置导航提示文字颜色
  /// \brief SetNavTipsColors
  /// \param cValue
  ///
  void Lncf_IndexNavListv::SetNavTipsColors(const QColor cValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetTipsColorVal(cValue);
  }

  /// 设置是否显示导航提醒
  /// \brief SetIsShowTooltip
  /// \param bValue
  ///
  void Lncf_IndexNavListv::SetIsShowTooltip(const bool &bValue)
  {
    if(pPanelNavIndex)
      pPanelNavIndex->SetIsShowTooltip(bValue);
  }

  /// 设置导航索引选中
  /// \brief SetNavIndexCheck
  /// \param uIndex
  ///
  void Lncf_IndexNavListv::SetNavIndexCheck(const uint uIndex,const bool bShowGrid)
  {
    if(!bGridNaviStyle){
        pPanelNavIndex->OnNavBtnActived(uIndex);
      }
    else{
        pGridsNavIndex->OnNavBtnActived(uIndex);
        if(bShowGrid)pGridsNavIndex->show();
      }
  }

  /// 导航索引被选中
  /// \brief NaviIndexChecked
  /// \param uIndex
  ///
  void Lncf_IndexNavListv::NaviIndexChecked(const uint uIndex)
  {
    emit NavBtnCheckEvts(uIndex);
  }

  /// 设置垂直导航条显示属性
  /// \brief SetShowNaviPanel
  /// \param bValue
  ///
  void Lncf_IndexNavListv::SetShowNaviPanel(const bool bValue)
  {
    //自定义代码实现
  }

至此带导航功能的列表封装完成,有关更多技术分享与交流请加QQ群:717743458。

下一篇 我们将分享如何绘制一个八卦罗盘,先给大家上个图给个悬念

 敬请期待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值