参照网上的资料,模仿了一份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实现。

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

最新文章

  1. 在SQL中 给字符串补0方法
  2. IOS开发之记录用户登陆状态
  3. Maven_profile_使用profile配置不同环境的properties(实践)
  4. C++ GC
  5. Spring+SpringMvc+Mybatis整合注意事项
  6. 开源 XFControls , 用于 Xamarin.Forms 的自定义控件集
  7. redis 内存泄露
  8. 【入门必备】最佳的 Node.js 学习教程和资料书籍
  9. ida GDB 远程调试
  10. 重拾C,一天一点点_4_随想
  11. CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法
  12. Swift2.0异常处理
  13. [深度思考]&#183;为什么CNN是同步(并行)而RNN是异步(串行)的呢?
  14. MySQL安全配置向导mysql_secure_installation详解
  15. cat &lt;&lt;EOF
  16. 公用表表达式 (CTE)、递归、所有子节点、sqlserver
  17. kebab HDU2883
  18. 关于linux上cron服务的python封装工具
  19. go语言圣经
  20. java 多线程9 : synchronized锁机制 之 代码块锁

热门文章

  1. Java中将对象或者集合对象转换成json字符串
  2. 本地拉取服务器上的项目,SVN 由于目标计算机积极拒绝 无法连接失败
  3. c# 实现定义一套中间SQL可以跨库执行的SQL语句
  4. osx系统使用技巧 -- 虚拟机virtualbox
  5. MySQL查询为什么没走索引?这篇文章带你全面解析
  6. 【跟着大佬学JavaScript】之lodash防抖节流合并
  7. PostgreSQL下的SQL Shell(psql)工具
  8. Unique -「企划」新生守则(?
  9. 毫秒值的概念和作用与Date类的构造方法和成员方法
  10. Nginx api接口调用配置