之前一直用的是Liferea。个人觉得不是很好。不喜欢的地方有三点:
1.经常不响应。这个不知道是为什么,经常卡住。
2.我需要的只是每天能看到更新的新闻。感觉设置的很多功能是我永远也用不到的。
3.界面。看新闻的是,我更希望的是它给我的是一个新闻的列表,像谷歌阅读器那样,然后我选择自己喜欢的
去全文阅读。而不是像它这样在一个界面上只给文章内容很小的地方,看这感觉总觉得缺了点什么。
先在用的是google reader,虽然速度有时慢了点,但还是很值得的。刚开始也想自己做一个,不过当时太忙了,
做了一半就放下了,现在也懒得做下去了,不过主要的功能都实现了,虽然看起来很难看。记录一下当时做的
思路。
当时想做的尽量简介为好,因为是自己用,所以很多功能都可以去掉,比如说菜单栏里就不用再加一个help
或者about之类的。主要的模块有RSS文件下载,解析,界面设计。这些做好之后就是其上面的一些操作:
基本上都是成对的。添加/删除一个源;更新一个/多个源,标记一个/多个源....
先是RSS文件解析这一块,要用到QT的XML相关模块。
QXmlStreamReader就是一个很实用的模块:
依据RSS的XML格式,很容易可以写出处理的函数:
RssXmlParser::RssXmlParser(QIODevice *device)
{
setDevice(device);
while(!atEnd())
{
readNext();
if(isStartElement())
{
if(name()=="rss")
{
read_rss();
}
}
}
}
从相应的XML文件读入信息,然后从"rss"标签开始处理:
void RssXmlParser::read_rss()
{
while(!atEnd())
{
readNext();
if(isStartElement())
{
if(name()=="channel")
{
read_channel();
}
}
if(isEndElement())
{
if(name()=="rss")
{
break;
}
}
}
}
void RssXmlParser::read_channel()
{
QString t;
while(!atEnd())
{
readNext();
if(isStartElement())
{
t=name().toString();
if(t=="title")
networkName=readElementText();
if(t=="item")
{
read_item();
}
}
if(isEndElement())
{
if(name()=="channel")
break;
}
}
}
这里要取出总的标题,作为界面显示用。
void RssXmlParser::read_item()
{
QString title;
QString link;
while(!atEnd())
{
readNext();
if(isStartElement())
{
if(name()=="title")
{
title=readElementText();
articles.insert(title,NULL);
}
if(name()=="link")
{
link=readElementText();
articles[title]=link;
}
}
if(isEndElement())
{
if(name()=="item")
break;
}
}
}
然后读出一个个文章条目。这里使用了一个QMAP,用来保存文章名与其相应的URL。
之后其实就很容易,因为真正显示网页内容的话在QWebkit里面只用两行代码就可以做到了。
QWebView* content;
content->load(QUrl(currentFeed[urlName]));
全文显示的效果很好,唯一的缺点就是如果网速太慢的话加载的话要等不少时间。这时候能够只显示
主要内容就很好,不过没做。用DOCK将界面的大部分区域分给QWebview,这样显示的效果会更好。
XML文件的下载我本来是用QHTTP模块来做,不过将相应代码融合在一块的时候却总是有问题,
所以只好将其单独编译,然后用QProcess来调用,这当然不是一个很好的方法,但也是无奈之举。
当加载很多RSS时,程序的启动就比较慢(既然调用了外部程序,其实还不如不写,直接用
wget也是一个不错的选择,大部分的linux发行版都会自带这个程序,下载速度应该不慢)。
还有就是要建一个配置的文件夹,然后保存相应的文件,RSS列表。不知道其他的RSS阅读器是怎么做的,
我的想法大体就是这样,不过还有太多东西没做,可能也有很多想错的地方。估计是没机会往下写了,
不过也在其中学到了不少东西。自己动手写一个常用的软件,知道它的运行机理,本身也是一件有趣的事情。
源码下载:http://www.2cto.com/uploadfile/2012/0416/20120416101231816.zip
摘自 逍遥之魂