山前大桥下,有一个傻瓜。一枚小学生,幽居荒山中。养了一群狗,还有一只猫。喜欢搞编程,缺钱打零工。数理史皆通,法文记心中。下厨会做饭,挥毫能舞文。
原本是在做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();
其它的信息会随着控件的完善在后续的文章中给出。