Qt,C++ 仿MAC桌面程序,DOCKBAR

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

原本是在做mac Osx 的dockbar,在做测试的过程中心血来潮想试试看看效果如何,于是就有了下面的结果。

 

后来转念一想,可以在windows上做一个和Mac OSX 一样的桌面程序,设置windows 任务栏隐藏即可完美模拟出MAC效果。但遗憾的是时间不允许,后面有时间再慢慢完善。

主要工作是DockBar ,支持绘制Dockbar 背景和独立的Item背景,支持图标和Item大小自定义,支持动画,支持弹跳,支持所有颜色自定义,支持自定义数据,自定义数据是一个结构体,后期会允许读取可执行程序。

由于代码尚未完成,因此本篇将不再贴出重要代码,不过对于支持的自定义属性接口可以先睹为快

属性接口代码如下

 Q_OBJECT
    Q_PROPERTY(float   fBtnAnimeScale READ GetBtnAnimeScale WRITE SetBtnAnimeScale)    //按钮动画放大比例
    Q_PROPERTY(uint    uButtonSpacing READ GetButtonSpacing WRITE SetButtonSpacing)    //按钮间距
    Q_PROPERTY(bool    bEnableBkgDraw READ GetEnableBkgDraw WRITE SetEnableBkgDraw)    //绘制按钮背景
    Q_PROPERTY(bool    bHasBkgBorders READ GetHasBkgBorders WRITE SetHasBkgBorders)    //绘制背景边框
    Q_PROPERTY(double  dBordersWidths READ GetBordersWidths WRITE SetBordersWidths)    //边框宽度.默认接近物理一像素
    Q_PROPERTY(uint    uBkgnRadiusVal READ GetBkgnRadiusVal WRITE SetBkgnRadiusVal)    //绘制的边框背景圆角
    Q_PROPERTY(int     uMarginsBottom READ GetMarginsBottom WRITE SetMarginsBottom)    //按钮距离底部边距
    Q_PROPERTY(double  dAnimateOffset READ GetAnimateOffset WRITE SetAnimateOffset)    //按钮动画偏移量基准比例
    Q_PROPERTY(bool    bEnableAnimate READ GetEnableAnimate WRITE SetEnableAnimate)    //是否启用动画效果

    Q_PROPERTY(QColor  cBkgndColorVal READ GetBkgndColorVal WRITE SetBkgndColorVal)    //背景颜色
    Q_PROPERTY(QColor  cBordersColors READ GetBordersColors WRITE SetBordersColors)    //边框颜色

    Q_PROPERTY(int     uDefaultBottom READ GetDefaultBottom)                           //静态按钮底部距离
    Q_PROPERTY(int     uMarginTopVals READ GetMarginTopVals)                           //按钮举例顶部边距
    Q_PROPERTY(double  dAnimOffsetVal READ GetAnimOffsetVal)                           //按钮动画偏移值

    Q_PROPERTY(QSize   sDockItemsSize READ GetDockItemsSize WRITE SetDockItemsSize)    //按钮初始尺寸
    Q_PROPERTY(QSize   sItemsIconSize READ GetItemsIconSize WRITE SetItemsIconSize)    //按钮初始尺寸

    Q_PROPERTY(uint    uMirrorSpacing READ GetMirrorSpacing WRITE SetMirrorSpacing)    //按钮图标底部与镜像图标顶部的距离

    Q_PROPERTY(QFont   tItemsTextFont READ GetItemsTextFont WRITE SetItemsTextFont)    //按钮标题文字字体对象
    Q_PROPERTY(QSize   sItemsTextSize READ GetItemsTextSize)                           //按钮标题文字尺寸
    Q_PROPERTY(uint    uTitlesSpacing READ GetTitlesSpacing WRITE SetTitlesSpacing)    //按钮文字底部到图标顶部的距离

    Q_PROPERTY(QColor  cItemsTxtColor READ GetItemsTxtColor WRITE SetItemsTxtColor)    //按钮标题颜色
    Q_PROPERTY(QColor  cTextBkgdColor READ GetTextBkgdColor WRITE SetTextBkgdColor)    //按钮标题背景颜色
    Q_PROPERTY(double  dTextBkgRadius READ GetTextBkgRadius WRITE SetTextBkgRadius)    //按钮标题背景圆角比
    Q_PROPERTY(QColor  cTextBorderClr READ GetTextBorderClr WRITE SetTextBorderClr)    //按钮标题边框颜色
    Q_PROPERTY(bool    bShowTxtBorder READ GetShowTxtBorder WRITE SetShowTxtBorder)    //是否显示按钮标题边框

    Q_PROPERTY(int     nTicksWhenTops READ GetTicksWhenTops WRITE SetTicksWhenTops)    //按钮向上弹跳高度上限,到此计数则回落,如此反复
    Q_PROPERTY(int     nStaticsBottom READ GetStaticsBottom WRITE SetStaticsBottom)    //按钮静止状态时所在水平线

    Q_PROPERTY(int     nJumpMaxValues READ GetJumpMaxValues WRITE SetJumpMaxValues)    //按钮弹跳周期上限,超过则停止弹跳
    Q_PROPERTY(bool    bDrawButtonBkg READ GetDrawButtonBkg WRITE SetDrawButtonBkg)    //是否显示按钮背景颜色
    Q_PROPERTY(QColor  cButtonBkgClrs READ GetButtonBkgClrs WRITE SetButtonBkgClrs)    //按钮背景颜色
    Q_PROPERTY(double  dItemBkgRadius READ GetItemBkgRadius WRITE SetItemBkgRadius)    //按钮背景边框圆角
    Q_PROPERTY(QColor  cBtnBorderClrs READ GetBtnBorderClrs WRITE SetBtnBorderClrs)    //按钮背景边框颜色
    Q_PROPERTY(bool    bShowBtnBorder READ GetShowBtnBorder WRITE SetShowBtnBorder)    //是否显示按钮边框
    Q_PROPERTY(double  dTextBorderWid READ GetTextBorderWid WRITE SetTextBorderWid)    //文本按钮文本边框宽度
    Q_PROPERTY(bool    bDrawBtnMirror READ GetDrawBtnMirror WRITE SetDrawBtnMirror)    //是否绘制按钮镜像图片

    Q_PROPERTY(double  dMirrorAlphaSc READ GetMirrorAlphaSc WRITE SetMirrorAlphaSc)    //按钮图标镜像透明度0-1

DockBar 控件主要函数定义如下

 /// 初始化Dock工具栏
    /// \brief InitDockWidgets
    ///
    void InitDockWidgets();

    /// 更新Dock工具栏矩形区域
    /// \brief UpdateDockRects
    ///
    void UpdateDockRects();
  protected:
    /// 重写系统绘制事件
    virtual void paintEvent(QPaintEvent* event) override;

    /// 绘制背景
    /// \brief DrawDockBackdrop
    /// \param painter
    ///
    void DrawDockBackdrop(QPainter *painter);

    /// 绘制按钮项
    /// \brief DrawDockItemsBtn
    /// \param patiner
    ///
    void DrawDockItemsBtn(QPainter *painter);

    /// 绘制系统鼠标移动事件
    virtual void mouseMoveEvent(QMouseEvent* event) override;

    /// 绘制鼠标离开事件
    virtual void leaveEvent(QEvent* event) override;

    /// 鼠标单击事件
    virtual void mousePressEvent(QMouseEvent* event) override;

    /// 鼠标双击事件
    virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
  private:
    uint                     uBarDockedPosi = 0;       //Dock Bar 停靠位置,0下,1左,2上,3右。目前版本仅支持底部停靠
    LNCFDOCKBARFRM_STYLE     tDockFrmStyles;           //Dock Bar 风格数据
    LNCFDOCKBARBTN_STYLE     tDockBtnStyles;           //Dock Bar 按钮风格
    QList<Lncf_QDockBtnItem> vDockItemsList;	       //Dock Item

    int                      uDefaultBottom;           //静态按钮底部距离
    int                      uMarginTopVals;           //按钮举例顶部边距
    QTimer*                  pBtnAnimeTimer;	       //按钮动画定时器
    double                   dAnimOffsetVal;           //按钮动画偏移值

  public:
    /// 添加一个按钮
    /// \brief AddDockItemsBtns
    /// \param pImage
    /// \param uTitle
    /// \param userData
    ///
    void AddDockItemsBtns(const QPixmap& pImage, const std::u16string& uTitle,const QVariant &userData = QVariant());

    /// 添加一个自定义风格的按钮
    /// \brief AddDockItemsBtns
    /// \param pImage
    /// \param uTitle
    /// \param tStyle
    /// \param userData
    ///
    void AddDockItemsBtns(const QPixmap& pImage, const std::u16string& uTitle,const LNCFDOCKBARBTN_STYLE& tStyle,const QVariant &userData = QVariant());

    /// 更新工具栏大小
    /// \brief UpdatedDockSizes
    ///
    void UpdatedDockSizes();

    /// 还原所有按钮
    /// \brief RestoreDockItems
    ///
    void RestoreDockItems();

    /// 重新排列按钮
    /// \brief RearrangeDockBtn
    ///
    void RearrangeDockBtn();

    /// 更新按钮动画坐标
    /// \brief UpdateAnimatePos
    /// \param pos
    ///
    void UpdateAnimatePos(QPoint pos);

    /// 更新目标按钮信息
    /// \brief UpdateDocksItems
    /// \param uIndex
    /// \param pImage
    /// \param sTitle
    ///
    void UpdateDocksItems(const uint &uIndex,const QPixmap& pImage,const std::u16string& sTitle);

    /// 更新目标按钮风格
    /// \brief UpdateItemsStyle
    /// \param uIndex
    /// \param tStyle
    ///
    void UpdateItemsStyle(const uint &uIndex,const LNCFDOCKBARBTN_STYLE& tStyle);

    /// 删除指定索引的按钮
    /// \brief RemoveDocksItems
    /// \param uIndex
    ///
    void RemoveDocksItems(const uint &uIndex);

  protected slots:
    /// 按钮跳动动画槽函数
    /// \brief ButtonJumpAnimat
    ///
    void ButtonJumpAnimat();

其它的信息会随着控件的完善在后续的文章中给出。

有关详细信息和技术交流,移步QQ群:717743458。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值