• 11906阅读
  • 12回复

Qt实现FlatUI样式 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2016-12-11
— 本帖被 realfan 执行加亮操作(2016-12-11) —
对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反而没有扁平化来得亲切。

Flat UI是基于Bootstrap之上进行二次开发的扁平化前端框架,他提供了动感、时尚的风格色调搭配,简洁、炫丽的功能组件,同时还提供了更为平滑的js交互动画,可以称得上前端扁平化设计框架的优秀代表之一。

既然是扁平化设计框架的优秀代表,当然需要在自己项目中应用应用,本人最早使用VB开发,而后转为C#开发,最后转为Qt开发,都是因为公司项目需要,根据需要不断学习新的编程框架,语言都是相通的,举一反三,以前用C#写的vista时钟控件和vista日历控件,稍微改改就转移成了Qt写的对应控件,非常方便,只要掌握了思想,熟练了一门语言和框架之后,其他的学起来特别快。

Qt中的qss机制,和css极为相似,感觉就是脱胎于css,用qss来实现Qt界面样式不是一般的方便,而是相当的爽,在看到FlatUI这样的精美的扁平化设计样式后,难以抑制手痒痒,就想用qss实现类似的风格。

第一步:实现按钮风格
按钮在大部分的可视化界面的项目中,出现的频率不是第一也是第二,所以首先来实现按钮对应的flat UI 扁平化风格。
根据官网的效果看,基本上要实现的就三种状态(正常状态+鼠标悬停状态+鼠标按下)(还有一种禁用状态)的两种颜色(背景色+前景色)的设置,前景色一般指的是文字颜色。
将改变对应按钮样式风格封装成一个函数,这样每次调用只需传入对应参数即可。
  1. void frmMain::setBtnQss(QPushButton *btn,
  2.                         QString normalColor, QString normalTextColor,
  3.                         QString hoverColor, QString hoverTextColor,
  4.                         QString pressedColor, QString pressedTextColor)
  5. {
  6.         QStringList qss;
  7.         qss.append(QString("QPushButton{border-style:none;padding:10px;border-radius:5px;color:%1;background:%2;}").arg(normalTextColor).arg(normalColor));
  8.         qss.append(QString("QPushButton:hover{color:%1;background:%2;}").arg(hoverTextColor).arg(hoverColor));
  9.         qss.append(QString("QPushButton:pressed{color:%1;background:%2;}").arg(pressedTextColor).arg(pressedColor));
  10.         btn->setStyleSheet(qss.join(""));
  11. }

使用时调用:
  1. setBtnQss(ui->btn1, "#34495E", "#FFFFFF", "#4E6D8C", "#F0F0F0", "#2D3E50", "#B8C6D1");
  2. setBtnQss(ui->btn2, "#1ABC9C", "#E6F8F5", "#2EE1C1", "#FFFFFF", "#16A086", "#A7EEE6");
  3. setBtnQss(ui->btn3, "#3498DB", "#FFFFFF", "#5DACE4", "#E5FEFF", "#2483C7", "#A0DAFB");
  4. setBtnQss(ui->btn4, "#E74C3C", "#FFFFFF", "#EC7064", "#FFF5E7", "#DC2D1A", "#F5A996");
第二步:实现文本输入框的风格
根据官网的效果看,基本上就是两种状态(正常状态+获得焦点状态)的两种颜色(边框颜色+文字颜色)的设置。
  1. void frmMain::setTxtQss(QLineEdit *txt, QString normalColor, QString focusColor)
  2. {
  3.         QStringList qss;
  4.         qss.append(QString("QLineEdit{border-style:none;padding:6px;border-radius:5px;border:2px solid %1;}").arg(normalColor));
  5.         qss.append(QString("QLineEdit:focus{border:2px solid %1;}").arg(focusColor));
  6.         txt->setStyleSheet(qss.join(""));
  7. }

使用时调用:
  1. setTxtQss(ui->txt1, "#DCE4EC", "#34495E");
  2. setTxtQss(ui->txt2, "#DCE4EC", "#1ABC9C");
  3. setTxtQss(ui->txt3, "#DCE4EC", "#3498DB");
  4. setTxtQss(ui->txt4, "#DCE4EC", "#E74C3C");
第三步:实现进度条的风格
根据官网的效果看,基本上就是两种颜色(正常背景色+当前值背景色)的设置。
  1. void frmMain::setBarQss(QProgressBar *bar, QString normalColor, QString chunkColor)
  2. {
  3.     int barHeight = 8;
  4.     int barRadius = 8;
  5.         QStringList qss;
  6.     qss.append(QString("QProgressBar{font:9pt;height:%2px;background:%1;border-radius:%3px;text-align:center;border:1px solid %1;}").arg(normalColor).arg(barHeight).arg(barRadius));
  7.     qss.append(QString("QProgressBar:chunk{border-radius:%2px;background-color:%1;}").arg(chunkColor).arg(barRadius));
  8.         bar->setStyleSheet(qss.join(""));
  9. }

使用时调用:
  1. setBarQss(ui->bar1, "#E8EDF2", "#E74C3C");
  2. setBarQss(ui->bar2, "#E8EDF2", "#1ABC9C");

第四步:实现滑块条的风格
根据官网的效果看,基本上就是三种颜色(默认背景色+当前值背景色+滑块颜色)的设置。
这里为了好看,特意将滑块改成圆形,这样更好看些。
  1. void frmMain::setSliderQss(QSlider *slider, QString normalColor, QString grooveColor, QString handleColor)
  2. {
  3.         int sliderHeight = 8;
  4.     int sliderRadius = 4;
  5.         int handleWidth = 13;
  6.         int handleRadius = 6;
  7.         int handleOffset = 3;
  8.         QStringList qss;
  9.         qss.append(QString("QSlider::groove:horizontal,QSlider::add-page:horizontal{height:%2px;border-radius:%3px;background:%1;}").arg(normalColor).arg(sliderHeight).arg(sliderRadius));
  10.         qss.append(QString("QSlider::sub-page:horizontal{height:%2px;border-radius:%3px;background:%1;}").arg(grooveColor).arg(sliderHeight).arg(sliderRadius));
  11.         qss.append(QString("QSlider::handle:horizontal{width:%2px;margin-top:-%3px;margin-bottom:-%3px;border-radius:%4px;"
  12.                            "background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.6 #FFFFFF,stop:0.8 %1);}")
  13.                    .arg(handleColor).arg(handleWidth).arg(handleOffset).arg(handleRadius));
  14.     slider->setStyleSheet(qss.join(""));
  15. }

使用时调用:
  1. setSliderQss(ui->slider1, "#E8EDF2", "#1ABC9C", "#1ABC9C");
  2. setSliderQss(ui->slider2, "#E8EDF2", "#E74C3C", "#E74C3C");

依次下去,还可以实现单选框、复选框、开关按钮等控件的样式。

其实在整个过程中和界面设计效果看,有一个核心就是颜色的搭配,很多人可能会问,我怎么知道那个颜色值是多少,推荐一个工具,绿色小巧无污染,叫屏幕拾色器,是要按住吸管往你看到的页面地方移动过去,就会自动将该颜色的值吸过来显示。我自己也用Qt实现过类似的这样一个小工具。

最终效果图:

完整源码下载http://download.csdn.net/detail/feiyangqingyun/9708136

除了qss样式控制外观外,还有一种办法也可以实现类似效果,而且更灵活,那就是自定义控件,用Qpainter重绘外观,尤其是高级控件的话用qss就很难实现,下面就是我重绘的一些自定义控件。





欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线liudianwu

只看该作者 1楼 发表于: 2016-12-11
本站下载地址: FlatUI.zip (4 K) 下载次数:491
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线nigoole

只看该作者 2楼 发表于: 2016-12-11
      
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线圣域天子

只看该作者 3楼 发表于: 2016-12-11
主要还是看美工的功底,Qt要实现起来还是容易的
在线boylebao

只看该作者 4楼 发表于: 2016-12-12
    
为Qt打造具有强大生产力的软件。
离线daodaoliang

只看该作者 5楼 发表于: 2016-12-12
没必要一个内容的帖子发好多遍啊。
离线beiqibing

只看该作者 6楼 发表于: 2016-12-12
离线return

只看该作者 7楼 发表于: 2016-12-12
    
离线bran_lee

只看该作者 8楼 发表于: 2016-12-12
当你只有锤子时,你看什么都像是钉子!
离线fsdhca

只看该作者 9楼 发表于: 2016-12-14
腾讯企点QQ 最新1.4.0新增功能以及变化
腾讯企点qq 最新1.4.0新增功能以及变化

企点账户中心:

1.会话邀请:新增会话邀请功能,可以在客户访问你的网站时自动弹出邀请,点击直接进入网页会话;

2.群配额优化:群配额有所提升,你的工号数越多,群配额就越多,可以放心大胆地新建和接收群;

3.客户删除优化:为你提供操作日志的查看和下载,让客户管理工作有迹可循;

4.公众号配额:每个qq服务号每月赠送5000配额,帮助你进行新媒体营销。

windows版客户端:

1.加好友:新增加好友按钮,你可以在有qq账号的客户的资料卡和会话窗口上直接点击加对方为好友,与对方建立单向好友关系;

2.创建讨论组:你可以在pc端快速邀请好友、群组成员、企点临时会话关系和组织架构成员进入讨论组,进行小范围会话;

3.微信语音消息:你可以接收到微信公众号粉丝发来的语音消息,并且客户轨迹也会为你记录收到的语音消息的相关信息;

4.消息列表漫游:支持联系人列表的多端漫游,每次你登录客户端都能看到最近与你联系的客户或同事的会话条;

5.webim优化:为你展现网页接待来源的匿名客户的ip及地址、识别客户id是否在客户库内并展示客户昵称,同时你还可以自主设置是否在跳转页面放置入口。

android/ios版客户端:

1.创建讨论组:你可以在移动端快速邀请好友、群组成员、企点临时会话关系和组织架构成员进入讨论组,进行小范围会话;

2.微信语音消息:你可以接收到微信公众号粉丝发来的语音消息,并且客户轨迹也会为你记录收到的语音消息的相关信息;

3.webim优化:为你展现网页接待来源的匿名客户的ip及地址、识别客户id是否在客户库内并展示客户昵称,同时你还可以自主设置是否在跳转页面放置入口;

4.员工通话:新增内部通话,你不仅能够用企点电话联系客户,还能够与同事用企点电话通话.

电话:18810886909     13263345668 企业qq:2885401572   2885401573  微信:741405363


离线mscheng

只看该作者 10楼 发表于: 2016-12-23
楼主,好东西
离线_winterhorse

只看该作者 11楼 发表于: 2018-01-29
        
离线cangyuegui

只看该作者 12楼 发表于: 2018-01-30
不建议把qss写到cpp内部
快速回复
限100 字节
 
上一个 下一个