西城

指尖代码,手上年华

联系 聚合 管理
  20 Posts :: 0 Stories :: 62 Comments :: 0 Trackbacks
之前一直用的是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阅读器是怎么做的,
我的想法大体就是这样,不过还有太多东西没做,可能也有很多想错的地方。估计是没机会往下写了,
不过也在其中学到了不少东西。自己动手写一个常用的软件,知道它的运行机理,本身也是一件有趣的事情。

源码下载
posted on 2012-04-15 22:49 西城 阅读(2401) 评论(0)  编辑 收藏 引用 所属分类: Qt

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理