4334|6

1803

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

晒用QT实现的----一个有个性的 RSS 阅读器 EEBrowse [复制链接]

本帖最后由 Study_Stellaris 于 2014-11-17 13:56 编辑

      之前因为工作需要开发一款图形界面的上位机软件,使用了 NI 的 LabView ,但是考虑到正版软件费用的问题,之后又用 C#   开发了一个版本,都说 C# 简单,但是开发 GUI 起来不是那么容易的,最主要的一点是没有特别好看的控件库,VS 自带的控件库离好看差的很远,好看的控件库基本都是收费的,比如有名的 IOCOMP。当然如果有大把的时间 PS 和逐个调试的话,也是可以做自己的控件。其实,还有一点,C 语言写习惯了,用 C# 还是很别扭。不过最最重要的一点是,无论是 Labview 、LabWindows 还是 C# VB Delphi ,跨平台的支持都不太好,不是说他们不能跨,只是移植起来需要大量的工作,而且还要熟悉新的调试工具,所以不要说这些都很容易实现,真正在一线写代码的人不会轻易说“这个很容易实现”,因为这不是简单的写代码、编译、运行就可以了,一个小地方的配置不当,最终都将消耗大把大把的时间去测试,编译,Debug 和 Release.

     Qt 的跨平台性的优势只有在经历过各种相关困扰后才能格外地体会到是多么爽。对于写代码的人来说,Qt 的 “Write less,Do More and Deploy Anywhere" 是非常有吸引力的。对于 Write Less 和 Do More 很多的编程语言都敢这么说,但是敢说 Deploy Anywhere 的寥寥。 两年前就接触 Qt ,由于自身精力不够就没有深入。不知道你们遇到过没有,从官网上下载的 Windows 版本的  Qt Creator 居然连例程都编译不过去,这对于新手来说,是灭顶的打击啊!好不容易下载了几个 G 的文件,最后居然连例程都编译不过去,而且从网上查找相关资料之后也没能解决,后来由于要抓紧时间写单片机的程序,所以 Qt 学习的过程就暂时了放下来。         近期上 Qt 官网发现 Qt 已经升级到 5.3.2 ,而且下载开源版本后,在 Windows 平台进行简单的配置就可以编译例程,以前的困惑不复存在了。另一点不得不说的是,Qt 网站上写的文档也很全,而且语言风格也比较贴近初学者,这又再一次激起了我学习 Qt 的热情。同时一直喜欢上的 EEWORLD 论坛也在举办活动,作为粉丝怎能不支持一下?

     之后了解到有不少的软件是用 Qt 开发的。比如 WPS ,VirtualBox,豆瓣FM客户端 等等.
     对于 Qt ,我和大多数人一样,也是个初学者。该如何入手呢?一方面,我们不能等待有项目需求的时候再动手,因为那个时候一是时间来不及,而是基础没有打扎实,想赶工期是很累的;另一方面,从基础入门的时候就有系统的学习和积累,后面开发项目时才可事半功倍。
    我的习惯是先找到自己喜欢的 Demo,然后好好分析一下。在浏览 Qt Example 的时候,发现一个 RSS 的 Demo 让后觉得很有趣,所以我就想不如写一个相关的程序吧。另一个原因是,我想体验一下使用 Qt Quick 和 QML 语言来编写界面到底是一种什么样的感觉。
    先上图,界面做的不是很好,毕竟刚开始,做界面美工的时间不是很多,加起来总共才花了二十个小时左右的时间。

    这是网易新闻的 RSS
   
    这是有关 Qt 开发的一些 Blog 的 Rss ,里边有些大神的博客,可以为以后学习 Qt 做储备。
   
   这是 EEWORLD 部分论坛版块的 RSS,小小的行动,支持我们的 EEWORLD。
   
   中间的 资源分享 和天气,音乐视频版块,暂时还没做。最后是一个更新界面,有点乱,当有新版本时,会显示下载链接。
   
  采用动态编译后包含必须的 dll 库文件,并打包成单个 exe 文件发布,刚过 30M ,压缩后比 30M 小一点,刚好可以作为一个附件上传,再大一点的话,就得分包上传了。  由于采用 Enigma Virtual Box 来进行 DLL 和 EXE 的压缩打包,所以可能会被 360 安全卫士误报为病毒并杀掉。所以解压后,360报毒时,添加到 360 信任。

   源代码在整理后会发布上来,供有需要的初学者参考。






查看本帖全部内容,请登录或者注册

EEBrowse_Release.zip

29.01 MB, 阅读权限: 30, 下载次数: 2

最新回复

界面设计的还是挺漂亮的 QT一直想学,一直没学,也不知道什么时候能入门  详情 回复 发表于 2014-11-16 22:18

赞赏

1

查看全部赞赏

点赞 关注
 
 

回复
举报

5970

帖子

8

TA的资源

版主

沙发
 
界面设计的还是挺漂亮的
QT一直想学,一直没学,也不知道什么时候能入门

点评

谢谢评分!打算随着学习的深入,持续优化一下。所以这个帖子打算持续更新。 随着功能的增加,使用 Qt 中的数据类型和控件会增加,界面也很快就会进行修改,我从基础开始,系统的学习一下 Qt 中 C++ 开发和 QML 的开  详情 回复 发表于 2014-11-17 10:24
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
本帖最后由 Study_Stellaris 于 2014-11-17 15:12 编辑
chenzhufly 发表于 2014-11-16 22:18
界面设计的还是挺漂亮的
QT一直想学,一直没学,也不知道什么时候能入门


      谢谢评分!打算随着学习的深入,持续优化一下。所以这个帖子打算持续更新。
随着功能的增加,使用 Qt 中的数据类型和控件会增加,界面也很快就会进行修改,我从基础开始,系统的学习一下 Qt 中 C++ 开发和 QML 的开发,然后参考一些开源项目中的代码,在了解了这些开源代码中的实现方法后,应用到这个软件里来。这样,一方面学习了理论知识,另一方面实际动手写写代码,看看是否最后按照设计的那样运行。

这次暂时不涉及到嵌入式 GUI 的开发,
一是因为嵌入式的 GUI 写到一定程度基本上再很难提高了,嵌入式平台资源有限,在交叉编译这种枯燥的过程中需要花费很多时间。如果在 PC 桌面端能够开发出很好的 GUI ,然后以 Qt 的跨平台优势,做一些裁剪,反而对后续嵌入式 GUI 的开发打下了坚实的基础。
另一方面,我想着重使用一下 Qt 中关于网络部分的模块。网络上的不缺数据来源,而且什么类型的数据都有,所以可以加强对数据处理能力的学习。




点评

了解一下 Qt5 随着桌面应用越来越被带触摸屏的移动设备所取代。所以在这个时候学习一些有关移动设备界面开发的技能还是不错的。 2012 年 Qt5 的发布似乎正是奔这个目标来的。在此之前,2005  详情 回复 发表于 2014-11-17 16:06
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

4
 
本帖最后由 Study_Stellaris 于 2014-11-17 16:07 编辑
Study_Stellaris 发表于 2014-11-17 10:24
谢谢评分!打算随着学习的深入,持续优化一下。所以这个帖子打算持续更新。
随着功能的增加,使 ...
了解一下 Qt5
       随着桌面应用越来越被带触摸屏的移动设备所取代。所以在这个时候学习一些有关移动设备界面开发的技能还是不错的。
2012 年 Qt5 的发布似乎正是奔这个目标来的。在此之前,2005年发布的 Qt4 到 Qt4.8 共经历了 7 年的时间。 Qt4 在设计的时候主要还是面向桌面应用的,主要是用来满足为不同平台编译的桌面应用能够保持一致的 UI 风格。打个比方,如果将 Mac OS 的软件界面风格保持到 Windows 下的话,一定会有很多人不习惯,所以为 Windows 编译的程序,要看起来像 Windows ,为 Mac OS 编译的要看起来像苹果的风格,否则就会显得很另类。Qt4很好地解决了这个问题,通过其跨平台特性,不用太多的工作量就可以让应用看起来很 Native.不过新的挑战来了,要求 Qt 也能够很好地支持触摸界面移动应用开发。所以 Qt5 在这方面是希望给人一个惊喜。从 Qt 4.7 中开始引进的 Qt Quick ,在 Qt 5.2 中也已经升级到了 Qt quick 2.
      关于 Qt5 的更多详细的特性可以上官网的 WiKi 上了解。
      Qt Quick 本身是几种技术的集合,包括类似于 HTML 的 UI 标记语言---QML,Javascript 还有Qt C++ 库。前端工程师使用 QML 可以集中精力放在如何设计出更漂亮的界面上,而后端工程师用 C++ 集中精力解决稳定性、性能和功能扩展上。
      QML 语言会有一些比如矩形(Rectangle)、图像(Image)、文本(Text)和鼠标区(MouseArea)之类的基本元素。通过对这些元素的属性的定义,可以在界面上勾勒出一些静态的组件,然后辅以动态脚本语言 Javascript,可以进一步实现更多漂亮的效果。QML 语言易读易懂。同时也可以用 Qt C++ 来进行扩展。所以这样也算是将前段与后端进行了分开。相比 .Net 平台的前后端分离方式,我个人更喜欢这一种。如果有网页设计基础的人,学过 HTML 和 CSS 的话,我相信在 Qt 中用 QML 写界面一定有种似曾相识的感觉。
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

5
 
本帖最后由 Study_Stellaris 于 2014-11-18 09:07 编辑

附件是源码。同时将源代码托管到了国内的 GitCafe ,这个网站类似于大名鼎鼎的 github.
如果在电脑里安装了  Git 。在 GitCafe 上搜索 EEBrowse ,就可以把代码像在 Github 上操作一样。
托管的一个好处时,可以做到比较好的版本控制。同时方便交流。在这里再分享一个 gitcafe 上用 Qt 写的开源项目,我认为是学习 Qt C++ 的一个不可多得好 Demo。
先上图:


这是一个用 Qt  C++ 写的豆瓣 FM ,下载后,可以用 Qt Creator 直接编译下来。目前我实际使用过程中,在 Windows 平台还是发现了一些 Bug.打算在通读代码后找找看。项目原来托管于 github ,后迁移到 gitcafe ,不过已经 5 个月没有更新。


EEBrowse_Backup.zip

200.02 KB, 阅读权限: 40, 下载次数: 1

 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

6
 
解下来正在添加天气信息,打算能够每隔半小时更新一次 PM25 数据,并能用图片显示出来。
目前已经可以获取数据了,正在研究在 QML 中的数据呈现方式。
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

7
 
本帖最后由 Study_Stellaris 于 2014-11-24 10:56 编辑
Study_Stellaris 发表于 2014-11-19 09:51
解下来正在添加天气信息,打算能够每隔半小时更新一次 PM25 数据,并能用图片显示出来。
目前已经可以获取 ...

这周添加了试下天气部分的功能。

做这个 RSS Reader 主要目的是为了学习和研究 Qt C++ 加 Qt QML 来进行界面开发的基础知识。会一直坚持学习下去,一直和大家分享有关 Qt 的学习过程。
通过这个过程,对 Qt 一个组件一个组件的去熟悉,应用。我相信经过一段时间,对 C++ 的理解会加深,用 Qt 的开发也会得心应手。
实现过程还是通过 Qt 的 XmlListModel 来从百度获取基于 XML 格式的数据。
然后通过 List 进行前端显示,这部分的功能还是比较简单的。
实际上 QML 加上特效,可以实现很多漂亮的动态效果,不过目前还没有到这个阶段,但这是一个目标。
后续我希望能够加上实时更新的功能。
关于这部分目前没有特别好的思路。打算是通过 Ajax+SVG 的方式来做。为后续在物联网给后端提供了数据之后,前端如何更好的通过 Qt 在 Desktop 、web browser 甚至是手持终端实时显示数据是一个绕不过的问题。
如果大家有比较好的关于实时显示的思路,欢迎大家多多指点。
  1. XmlListModel {
  2.             id: feedModelBaiduWeather
  3.             source: window.currentFeed
  4.             query: "/CityWeatherResponse"
  5.             XmlRole { name: "error"; query: "error/string()" }
  6.             XmlRole { name: "status"; query: "status/string()" }
  7.             XmlRole { name: "requestdate"; query: "date/string()" }
  8.             XmlRole { name: "currentCity"; query: "results/currentCity/string()" }
  9.             XmlRole { name:"pm25";query:"results/pm25/string()"}

  10.             XmlRole { name:"date1";                         query:"results/weather_data/date[1]/string()"}
  11.             XmlRole { name: "dayPictureUrl1";     query: "results/weather_data/dayPictureUrl[1]/string()" }
  12.             XmlRole { name: "nightPictureUrl";  query: "results/weather_data/nightPictureUrl[1]/string()" }
  13.             XmlRole { name:"weather1";                   query:"results/weather_data/weather[1]/string()"}
  14.             XmlRole { name:"wind1";                         query:"results/weather_data/wind[1]/string()"}
  15.             XmlRole { name:"temperature1";           query:"results/weather_data/temperature[1]/string()"}




  16.             XmlRole { name:"date2";                         query:"results/weather_data/date[2]/string()"}
  17.             XmlRole { name: "dayPictureUrl2";     query: "results/weather_data/dayPictureUrl[2]/string()" }
  18.             XmlRole { name: "nightPictureUr2";  query: "results/weather_data/nightPictureUrl[2]/string()" }
  19.             XmlRole { name:"weather2";                   query:"results/weather_data/weather[2]/string()"}
  20.             XmlRole { name:"wind2";                         query:"results/weather_data/wind[2]/string()"}
  21.             XmlRole { name:"temperature2";           query:"results/weather_data/temperature[2]/string()"}


  22.             XmlRole { name:"date3";                         query:"results/weather_data/date[3]/string()"}
  23.             XmlRole { name: "dayPictureUrl3";     query: "results/weather_data/dayPictureUrl[3]/string()" }
  24.             XmlRole { name: "nightPictureUrl3"; query: "results/weather_data/nightPictureUrl[3]/string()" }
  25.             XmlRole { name:"weather3";                   query:"results/weather_data/weather[3]/string()"}
  26.             XmlRole { name:"wind3";                         query:"results/weather_data/wind[3]/string()"}
  27.             XmlRole { name:"temperature3";           query:"results/weather_data/temperature[3]/string()"}

  28.             XmlRole { name:"date4";                         query:"results/weather_data/date[4]/string()"}
  29.             XmlRole { name: "dayPictureUrl4";     query: "results/weather_data/dayPictureUrl[4]/string()" }
  30.             XmlRole { name: "nightPictureUrl4"; query: "results/weather_data/nightPictureUrl[4]/string()" }
  31.             XmlRole { name:"weather4";                   query:"results/weather_data/weather[4]/string()"}
  32.             XmlRole { name:"wind4";                         query:"results/weather_data/wind[4]/string()"}
  33.             XmlRole { name:"temperature4";           query:"results/weather_data/temperature[4]/string()"}

  34.             XmlRole { name:"titleIndex1";           query:"results/index/title[1]/string()"}
  35.             XmlRole { name:"zsIndex1";                 query:"results/index/zs[1]/string()"}
  36.             XmlRole { name:"tiptIndex1";             query:"results/index/tipt[1]/string()"}
  37.             XmlRole { name:"desIndex1";               query:"results/index/des[1]/string()"}


  38.             XmlRole { name:"titleIndex2";           query:"results/index/title[2]/string()"}
  39.             XmlRole { name:"zsIndex2";                 query:"results/index/zs[2]/string()"}
  40.             XmlRole { name:"tiptIndex2";             query:"results/index/tipt[2]/string()"}
  41.             XmlRole { name:"desIndex2";               query:"results/index/des[2]/string()"}

  42.             XmlRole { name:"titleIndex3";           query:"results/index/title[3]/string()"}
  43.             XmlRole { name:"zsIndex3";                 query:"results/index/zs[3]/string()"}
  44.             XmlRole { name:"tiptIndex3";             query:"results/index/tipt[3]/string()"}
  45.             XmlRole { name:"desIndex3";               query:"results/index/des[3]/string()"}

  46.             XmlRole { name:"titleIndex4";           query:"results/index/title[4]/string()"}
  47.             XmlRole { name:"zsIndex4";                 query:"results/index/zs[4]/string()"}
  48.             XmlRole { name:"tiptIndex4";             query:"results/index/tipt[4]/string()"}
  49.             XmlRole { name:"desIndex4";               query:"results/index/des[4]/string()"}

  50.             XmlRole { name:"titleIndex5";           query:"results/index/title[5]/string()"}
  51.             XmlRole { name:"zsIndex5";                 query:"results/index/zs[5]/string()"}
  52.             XmlRole { name:"tiptIndex5";             query:"results/index/tipt[5]/string()"}
  53.             XmlRole { name:"desIndex5";               query:"results/index/des[5]/string()"}

  54.             XmlRole { name:"titleIndex6";           query:"results/index/title[6]/string()"}
  55.             XmlRole { name:"zsIndex6";                 query:"results/index/zs[6]/string()"}
  56.             XmlRole { name:"tiptIndex6";             query:"results/index/tipt[6]/string()"}
  57.             XmlRole { name:"desIndex6";               query:"results/index/des[6]/string()"}
  58.          }
复制代码


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表