参照网上的资料,模仿了一份360新特效的界面。

源代码在:http://download.csdn.net/detail/zhangyang1990828/5238013

360真实效果:(最好自己打开360看看!!)

先上效果图。(纯UI)

(现在没有任何的功能,之后再陆续添加,这样做比较好理解)

首先需要绘制Frame,就是看到的整个窗口。它是由两个圆角矩形组合起来的。

绘制代码如下:

  1. void DataBrain::paintEvent(QPaintEvent *)
  2. {
  3. QBitmap bitmap(this->size());//创建一个位图来存储这个组合体
  4. QPainter painter(&bitmap);//创建一个类似于绘画板的对象,通过它来在bitmap上绘图
  5. painter.fillRect(bitmap.rect(),Qt::white);
  6. painter.setBrush(QColor(0,0,0));
  7. painter.drawRoundRect(QRect(0,2,this->width(),this->height()-2),5,5);
  8. painter.drawRoundRect(QRect(20,0,100,2),2,2);
  9. setMask(bitmap);//将画好的bitmap遮挡在屏幕前方
  10. }

这样就绘制好了整个窗口的Frame,之后需要做的就是在这个Frame上贴图制作模糊透明效果的按钮。

背景其实就是将两张图片分别存储到两个label中,让后通过setGeometry将label放到指定的位置。两张是因为之后要实现动态的效果,所以要两张。(往后看就明白了)

上代码:

  1. void DataBrain::createFrame()
  2. {
  3. this->setWindowTitle(tr("DataBrain"));
  4. this->resize(QSize(WINDOW_WIDTH,WINDOW_HEIGHT));
  5. setWindowFlags(Qt::FramelessWindowHint);//设置窗口的样式
  6. m_pLabelBkTop=new QLabel(this);
  7. m_pLabelBkTop->setPixmap(QPixmap(":/images/images/bg_top.png"));
  8. m_pLabelBkTop->setGeometry(QRect(0,2,this->width(),this->height()-2));//在目标区域显示label
  9. m_pLabelBkBottom=new QLabel(this);
  10. m_pLabelBkBottom->setPixmap(QPixmap(":/images/images/bg_bottom.png"));
  11. m_pLabelBkBottom->setGeometry(QRect(0,2,this->width(),this->height()-2));
  12. }

为了实现最后的拖动效果,我们需要将前景的四张拖动出现的图合并成一张。

窗口上的显示“360安全桌面”“木马防火墙”..的按钮的实现,我们将这种按钮抽象成一个类,方便以后的调用。
之后只要将这类按钮的对象布局到这个窗口上就实现了前面实现的效果了(纯UI)。

按钮类里的函数:(不贴全部代码了,需要的去http://download.csdn.net/detail/zhangyang1990828/5238013下载

  1. void DataBrain::createWidget()//四张图片合并一个pixmap
  2. {
  3. QPixmap pixmap(QSize(this->width()*WINDOW_PAGE_COUNT,WINDOW_HEIGHT-2));
  4. QPainter painter(&pixmap);
  5. for(int i=0;i<WINDOW_PAGE_COUNT;i++)
  6. {
  7. painter.drawImage(QRect(WINDOW_WIDTH*i,0,WINDOW_WIDTH,WINDOW_HEIGHT-2),QImage(tr(":/images/images/desktop_%1.jpg").arg(i)));
  8. }
  9. m_pLabelFg=new QLabel(this);
  10. m_pLabelFg->resize(pixmap.size());
  11. m_pLabelFg->setPixmap(pixmap);
  12. m_pLabelFg->move(WINDOW_START_X,WINDOW_START_Y);
  13. QStringList nameList;
  14. nameList << tr("360安全桌面 ")
  15. << tr("木马防火墙  ")
  16. << tr("360保镖     ")
  17. << tr("电脑门诊    ");
  18. for(int i=0;i<WINDOW_BUTTON_COUNT;i++)
  19. {
  20. CLabel *label=new CLabel(this);
  21. label->resize(QSize(155,45));
  22. label->setPixmap(QPixmap(tr(";/images/images/btn_%1.png").arg(i)));
  23. label->setText(nameList.at(i));
  24. label->move(8+i*170,319);
  25. m_pLabelBtnArray[i]=label;
  26. }
  27. m_pCloseBtn=new QToolButton(this); //关闭按钮
  28. m_pCloseBtn->setFocusPolicy(Qt::NoFocus);
  29. m_pCloseBtn->setStyleSheet("background:transparent;border:0px;");
  30. setButtonIcon(m_pCloseBtn, EButtonMouseDefault);
  31. m_pCloseBtn->move(QPoint(this->width()-52,1));
  32. //raise widget
  33. m_pLabelBkTop->raise();
  34. m_pCloseBtn->raise();
  35. for (int i = 0; i < WINDOW_BUTTON_COUNT; i++)
  36. {
  37. m_pLabelBtnArray[i]->raise();
  38. }
  39. }
  40. void DataBrain::createFilter()
  41. {
  42. }
  43. void DataBrain::setButtonIcon(QToolButton *btn, EButtonMouseState state)
  44. {
  45. QPixmap pixmap(":/images/images/btn_close.png");//自定义关闭按钮
  46. int nWidth = pixmap.width()/4;
  47. int nHeight = pixmap.height();
  48. btn->setIcon(QIcon(pixmap.copy(QRect(state * nWidth, 0, nWidth, nHeight))));
  49. btn->setIconSize(QSize(nWidth, nHeight));
  50. }

这样就完成了360新特性界面的纯UI实现。

下一章实现窗口的拖拽等功能。

QT学习(四)----360界面制作(1)的更多相关文章

  1. QT学习(五)----360界面制作(2终结)

    继续上一章的360新特性界面.源代码:http://download.csdn.net/detail/zhangyang1990828/5241242 上一章中实现了整个界面的纯UI设计,这次我们让它 ...

  2. qt学习 (五) 登陆界面之连接按钮

    登陆步骤是比对输入的账号密码与数据库中的表项目是否一致 一样,  跳出mainwidget对话框 不一样,跳出消息错误框 今天就是要进去, 因为进去以后是widget的窗口,所以把用来核对消息的数据库 ...

  3. Qt学习(四)—实例涂鸦画板mspaint

    一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二.实现涂鸦板 1.新建工程mspaint, ...

  4. Qt之实现360安全卫士主界面代码开源

    匆匆一年又过去了,总结去年一年的节奏就是忙爆了:生活忙.工作忙,值得庆幸的是没有瞎忙:今天打开博客园查看我的博客,才发现几乎差不多一年时间没写博客了:博客文章就是记忆,就是曾经努力过的见证,感谢博客园 ...

  5. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  6. QT学习之第一个程序

    QT学习之第一个程序 目录 手动创建主窗口 居中显示 添加窗口图标 显示提示文本 Message Box的应用 手动连接信号与槽 手动创建主窗口 窗口类型 QMainWindow: 可以包含菜单栏.工 ...

  7. Qt 学习之路 2(51):布尔表达式树模型

    Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...

  8. Qt 学习之路 2(27):渐变

    Qt 学习之路 2(27):渐变 豆子 2012年11月20日 Qt 学习之路 2 17条评论 渐变是绘图中很常见的一种功能,简单来说就是可以把几种颜色混合在一起,让它们能够自然地过渡,而不是一下子变 ...

  9. Qt 学习之路 2(10):对象模型

    Home / Qt 学习之路 2 / Qt 学习之路 2(10):对象模型 Qt 学习之路 2(10):对象模型  豆子  2012年9月2日  Qt 学习之路 2  45条评论 标准 C++ 对象模 ...

随机推荐

  1. DotNET程序员面向API编程的正确姿势

    原文:https://blog.csdn.net/u013201439/article/details/49981071 补充:按照步骤成功加载文档后,选择索引可以快速发现相关的内容,如图

  2. Python基础教程:模块重载的五种方法

    环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 $ tree foo foo └── bar.py 0 directories, 1 file bar.py 的内容非常简单,只写 ...

  3. EasyExcel导出添加批注

    直接看代码.根据个人需要做改动 注:POI也可以做批注,文章链接https://www.cnblogs.com/qq1445496485/p/15622664.html /** * 导出(批注) * ...

  4. POI设置列宽 自动调整列宽

    for (int i = 0; i <= totalColumn; i++) { sheet.autoSizeColumn((short)i,true); //调整列宽 } 其中totalCol ...

  5. 使用Visio 2007画用例图没有include(包含)关系且包含关系使用的线不是虚线的解决办法

    使用Visio 2007画用例图没有include(包含)关系且包含关系使用的线不是虚线的解决办法 1 在工具栏选择UML------>选择构造型 如下操作 2 拖动 "扩展" ...

  6. NC24622 Brownie Slicing

    NC24622 Brownie Slicing 题目 题目描述 Bessie has baked a rectangular brownie that can be thought of as an ...

  7. leetcode教程系列——Binary Tree

    tree是一种常用的数据结构用来模拟真实物理世界里树的层级结构.每个tree有一个根(root)节点和指向其他节点的叶子(leaf)节点.从graph的角度看,tree也可以看作是有N个节点和N-1个 ...

  8. CSS进阶内容—浮动和定位详解

    CSS进阶内容-浮动和定位详解 我们在学习了CSS的基本知识和盒子之后,就该了解一下网页的整体构成了 当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:秋落雨微凉 - 博客园 CSS的三种布 ...

  9. 5-1 Vant | 移动组件库

    Vant 什么是Vant Vant是一个轻量,可靠的移动端组件库,2017开源 目前 Vant 官方提供了 Vue 2 版本.Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付 ...

  10. LNMP架构及DISCUZ论坛部署

    1)(5分)服务器IP地址规划:client:12.0.0.12/24,网关服务器:ens36:12.0.0.1/24.ens33:172.16.10.1/24,Web1:172.16.10.10/2 ...