参照网上的资料,模仿了一份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. kali渗透测试阅读目录

    一.渗透测试介绍 渗透测试介绍及渗透环境配置 二.信息收集 kali 信息收集 三.漏洞扫描 kali 漏洞扫描 四.漏洞利用 kali msf漏洞利用

  2. cut命令、case与select语句

    cut命令 常用参数: -c character 字符 -d delimiter 分隔符 -f field 域(列) --output-delimiter 输出分隔符 例: # echo 12345 ...

  3. Could not transfer artifact xxx from/to xxx解决方案

    maven中默认的镜像加载是这个 在setting.xml文件中 <mirror> <id>nexus</id> <mirrorOf>*</mir ...

  4. centos7解决无法上网的问题

    问题:centos7出现无法进行联网,如下图所示,执行该命令: ping qq.com 出现如下情况: 解决方法: 首先cd到需要修改文件的所在目录下: [root@localhost ~]# cd ...

  5. 10分钟实现dotnet程序在linux下的自动部署

    背景 一直以来,程序署都是非常麻烦且无聊的事情,在公司一般都会有 devops 方案,整个 cicd 过程涉及的工具还是挺多的,搭建起来比较麻烦.那么对于一些自己的小型项目,又不想搭建一套这样的环境, ...

  6. NC18979 毒瘤xor

    NC18979 毒瘤xor 题目 题目描述 小a有 \(N\) 个数 \(a_1, a_2, ..., a_N\) ,给出 \(q\) 个询问,每次询问给出区间 \([L, R]\) ,现在请你找到一 ...

  7. 岭回归和LASSO

    0.对于正则罚项的理解 1.岭回归(L2 ridge regression ) 是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信 ...

  8. 最强人工智能 OpenAI 极简教程

    大家好哇,新同学都叫我张北海,老同学都叫我老胡,其实是一个人,只是我特别喜欢章北海这个<三体>中的人物,张是错别字. 上个月安利了一波:机器学习自动补全代(hán)码(shù)神器,然后就 ...

  9. 零基础学Java(6)控制流程

    控制流程 与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程. 块作用域 我们首先要了解块(block)的概念. 块是指由若干条Java语句组成的语句,并用一对大括号括起来.块确定了变 ...

  10. 基于NoCode构建简历编辑器

    基于NoCode构建简历编辑器 基于NoCode构建简历编辑器,要参加秋招了,因为各种模版用起来细节上并不是很满意,所以尝试做个简单的拖拽简历编辑器. 描述 Github | Resume DEMO ...