参照网上的资料,模仿了一份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. RPA应用场景-信用卡交易争议后续流程

    RPA应用场景-信用卡交易争议后续流程 场景概述 信用卡交易争议后续流程 所涉系统名称 客服系统,邮件 人工操作(时间/次) 4小时 所涉人工数量20操作频率 不定时 场景流程 1.RPA自动接收客户 ...

  2. linux配置svn

    1.安装 yum install subversion 2.测试安装是否成功: svnserve --version 3.创建目录并配置 建立版本库目录 mkdir -pv /data/svn/svn ...

  3. CentOS 7 快速安装docker-compose

    安装docker-composegithub的地址下载太慢了,国内可以使用http://get.daocloud.io/#install-compose网站上面的地址. 首先下载docker-comp ...

  4. 015(Power string)(哈希表)

    题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1457 题目思路: 思路就是预设子串的长度,从1开始,而后一段一段试 试到一个对不上的就打回 如果 ...

  5. eclipse使用小记录

    (手动狗头)之前用eclipse的时候左侧的project栏不知道为什么整没了....记录一下 1.击Window--how View--other 2.Project Explorer,就可以了

  6. mobaxterm会话同步

    前言 之前用过MobaXterm,想不起来为啥不用了.后面主要还是用xshell,最近又在用WindTerm,WindTerm还不错,奈何有不少的Bug,所以又来研究一下MobaXterm 下午摸索了 ...

  7. SpringBoot配置文件读取过程分析

    整体流程分析 SpringBoot的配置文件有两种 ,一种是 properties文件,一种是yml文件.在SpringBoot启动过程中会对这些文件进行解析加载.在SpringBoot启动的过程中, ...

  8. Solution -「2021.11.27」\Infty

    T1. 显然往 \(x < 0, y < 0\) 的点走一定不优. 根据转移式可发现 \(C(x, y)\) 即从 \((0, 0)\) 走到 \((x, y)\) 的方案数 \(\dbi ...

  9. vue发布自定义组件到npm

    一.使用 vue create currentdatetime创建项目(可查考https://cli.vuejs.org/zh/guide/creating-a-project.html),创建成功后 ...

  10. DQL分组查询和DQL分页查询

    分组查询: 1.语法:group by 分组字段: 2.注意: 分组之后查询的字符按:分组字段.聚合函数 where 和having 的区别 where再分组前进行限定,如果不满足条件则不参与分组.h ...