Qt 自定义界面,透明与用户风格 一

来源:互联网 发布:物业管理app 源码 编辑:程序博客网 时间:2024/05/02 01:11

以前有朋友自己写了关于自己设计360安全卫时的界面,个人感觉还是很不错的。(以下就称作360)

于是学习了一下,并自己组织实践了一把, 有的地方思路和那位童鞋不大一样, 就打算一起贴上来,让有兴趣的朋友参考参考

实践了一把, 有的地方思路和那位童鞋不大一样, 就打算一起贴上来,让有兴趣的朋友参考参考

我的代码还没有完全写好, 界面和卫士的也不一样, 就一步一步慢慢展示吧. 争取近期能完成.

 

先看看主界面的样子,为了看到圆角的边框,截图稍微大了一点点, 就能看到两边的圆角了。

 

具体实现的方法,如果360中已经详细描述的,我就不再赘述了, 说些不一样的

1、 在程序的架构上与360的是不一样的,我将外框作为单独的userFrame类,其功能是实现窗口的放缩、拖动、最大最小化、关闭、双击的功能,并包含了一个状态条。

边框是采用了和360一样的处理,把系统的边框拿掉,然后自己创建.

我创建了一个空间的枚举,想法是这样的:根据枚举来获取框架上的所有元素,这样框架上所有的控件都是可以在外部进行编辑的,这样应该更适合开发,也许基础功能会多做一点,也还是值得的。

    /** @brief 控件标签的枚举.*/
    enum StyleFlages{
        NoControl = -1,
        userFrame = 0,
        userFrameTitleWidget,
        userFrameAppIcon,
        userFrameAppTitle,
        userFrameStyleChangeButton,
        userFrameAppMenuButton,
        userFrameAppMinButton,
        userFrameAppMaxButton,
        userFrameAppCloseButton,
        userFrameStatuBar,

        userFrameLayout_VBoxLayout,
        userFrameLayout_BoxLayoutTitle,
        userFrameLayout_BoxLayoutButton,
        ElseControl
    };

    /** @brief  获取某个子控件.
    *
    *  @details 获取某个子控件.
    *  @param   flag 窗体的子控件标签.
    *  @return  控件指针.
    */
    QObject* getChild(StyleFlages flag);

比如我要设置关闭按钮的图标时,就可以在外部调用时这样写:

    QsfToolButton* btn = dynamic_cast<QsfToolButton*>(uFrame->getChild(QsUserFrame::userFrameAppCloseButton));
关于 QsfToolButton我在下面还会继续讲述。
框架的主要控件有以下这些

private:
    /** @brief  窗口图标. */
    QLabel *appIcon;
    /** @brief  窗口标题. */
    QLabel *appTitle;
    /** @brief  按钮:换肤. */
    QsfToolButton *styleChangeButton;
    /** @brief  按钮:菜单. */
    QsfToolButton *appMenuButton;
    /** @brief  按钮:最小化. */
    QsfToolButton *appMinButton;
    /** @brief  按钮:菜最大化/常规. */
    QsfToolButton *appMaxButton;
    /** @brief  按钮:关闭. */
    QsfToolButton *appCloseButton;
   
    /** @brief  菜单. */
    QMenu *appMenu;

    /** @brief  纵向布局,作为根布局. */
    QVBoxLayout *vBoxLayout;
    /** @brief  横向布局1,作为顶部标题栏布局. */
    QHBoxLayout *hBoxLayoutTitle;
    /** @brief  横向布局2,作为顶部标题栏上的按钮布局. */
    QHBoxLayout *hBoxLayoutButton;

    /** @brief  工作区的布局. */
    QGridLayout* m_workGridLayout;

    /** @brief  标题栏. */
    QWidget* widTitle;

    /** @brief  状态栏. */
    QStatusBar *statusBar;

组织的方法与360例子里大同小异

 

2、主窗口的内容是继承自QMainWindow,包含了菜单栏、工具栏、工作区、Doc窗口等。

      这样每一个新的程序或界面都可以是用这个框架,而不必像360中的实现那样框架仅能为单个应用服务了。这个提高了开发的扩展性,应该是有进步的。

     暂时我还没有做好关于360那样的界面,下一节的时候大概就能讲的到了。

3、框架上的按钮是继承自QPushButton来做的,没有像360里那样实现,而是直接使用了两种图标显示的方式(偷懒了不少,有兴趣的童鞋可以继续完善)

   我的方法是设置鼠标in和out时显示不同的图片,原理都是一样的,只是我没有去创建事件过滤器。

    /** @brief  设置图标.
    *
    *  @details 设置图标,按纽的大小为第一个图片的尺寸.
    *  @param   iconIn 鼠标经过时的图标.
    *  @param   iconOut 平常状态的图标.
    *  @return  .
    */
    void setIcon(QPixmap iconIn, QPixmap iconOut);

 

对于protected:
void QsfToolButton::enterEvent( QEvent * )
{
    QPushButton::setIcon(m_iconIn);
}

void QsfToolButton::leaveEvent( QEvent * )
{
    QPushButton::setIcon(m_iconOut);
}
这两个方法大家就应该很熟悉了,这样就有了比较好看的鼠标动作。

 

360实例: http://www.cnblogs.com/appsucc/archive/2012/03/14/2395657.html