• 19740阅读
  • 35回复

QtRSSReader(alpha3.0 更新) [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 倒序阅读 楼主  发表于: 2008-09-17
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2009-01-19) —
刚过去的两周比较忙碌,趁端午休息对QtRSSReader进行下代码重构,
下阶段的目的主要是代码重构和加入对QSS的支持。
顺便把名字改了,应该是第三版才对。
(如果你是冲3.0来的话,那么你上当了,嘿嘿~)
================================2009-05-30的分割线====================================
自上次更新以来,转眼又过了3周时间,对于QtRSSReader的开发也是时断时续,
想着不能继续放纵下去了,于是今天又添加了一部分功能
只是简单的实现了双击查看新闻的功能,具体实现内容参考第28楼内容。
QtRSSReader到目前为止在功能上完备了。
接下来,引入CPPUnit的测试框架,
重构QtRSSReader的代码,
完善浏览功能,增强用户体验。
呵呵~
================================2009-05-17的分割线====================================
谢谢大家多日来的关注,无奈我对Qt的掌握有限,开发进度比较慢。
眼见帖子就要沉到潭底,迫不及待放出最新开发成果。
(最终效果到请各位移步到27楼参观)
这次的代码实在是惨不忍睹,就不贴了

我会尽量在5.1发布QtRSSReader的Alpha 3 版本。
================================2009-04-27的分割线====================================
QtRSSReader Alpha 2.0更新以上传,详细信息请看第26楼。
欢迎大家多提宝贵意见!
================================2009-04-11的分割线====================================
Alpha版本和二进制文件已经贴到25楼。
================================2009-03-20的分割线====================================


大家好,
我是个QT新手,深知书上得来终觉浅,绝知此事要躬行.
想和大家一起开发一个RSS阅读器,提高QT的水平,有感兴趣的一起做吧.

我曾经用Delphi做过一个RSS阅读器,自我感觉还不错.
最后由于公司使用了ISA防火墙,具体什么产品我不是很了解,没有搞的定NTLM认证,放下了.

现在装上了Ubuntu,希望能够制作一个跨平台的RSS阅读器,
在Ubuntu和Windows中都能够使用.

感兴趣的可以聊聊.(注明QTCN)
MSN: vincent_wjy@hotmail.com.cn
Mail:wujunyu@gmail.com
QQ不常用.

另,了解开源数据库的兄弟推荐一个文件数据库吧.
类似Access,只要通过数据库引擎连接上数据库文件就能操作的就行.
因为Ubuntu能够直接访问Windows的磁盘,所以想共享RSS订阅信息
[ 此帖被wvins在2009-05-30 21:49重新编辑 ]
离线wvins
只看该作者 1楼 发表于: 2008-09-17
如果发错了板块,还请斑竹帮忙转到正确的板块
离线wvins
只看该作者 2楼 发表于: 2008-09-25
没人...

目前我已经决定使用SQLite3存放订阅频道信息,保存离线新闻.
技术上能够使用Webkit展现网页,并且能够存取数据库了.

还有一些细节性的技术问题,比如说Delphi中的Frame怎么弄,这些在实际开发过程中在学习吧.
(貌似Widget就是一个Frame吧)
离线wvins
只看该作者 3楼 发表于: 2008-09-26
我又回来了~(以后我的所有的QT摸索都会想着QT版的RSSReader,所有的文章都会接在这篇文章后面)
今天的任务是使用QHttp下载网站的图标.
也就是FavIcon.ico文件.
花了两个小时写了一段代码,郁闷至极,图像也没有能够下载下来,大概和没有通过NTLM认证有关,需要回家试了才知道.先贴出来,吐吐苦水~
----------
简单的画了个界面,见附件
我的界面逻辑放在另一个头文件中.DlgFavIcon.h,内容如下:
#ifndef H_DLGFAVICON_H
#define H_DLGFAVICON_H
#include <QDialog>
#include <QHttp>
#include <QMessageBox>
#include <Exception>
//本来想使用Exception的,不过完全忘记了...
//最后使用QMessageBox显示的错误,
 
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QTemporaryFile>
#include "ui_DisplayFavIcon.h"

//using namespace std;
//也是为了使用异常~


class DlgFavIcon: public QDialog
{
    Q_OBJECT
public:
    DlgFavIcon():QDialog()
    {
        ui.setupUi(this);
        connect(ui.pushButton, SIGNAL(clicked()),
                this, SLOT(displayIcon()));
    }

private:
    QHttp http;
    QTemporaryFile file;
    QPixmap pixmap;
    Ui_Dialog ui;
private slots:
    void displayIcon()
    {
        http.setHost(ui.lineEdit->text());
        file.open();
        http.get("/favicon.ico", &file);
        //OK~到了这里,我有需要学习一下QT中是如何处理文件的,
        if (file.size() == 0)
        {
            QMessageBox::information(0, "Information", "file not down!");
            return;//文件没有下载下来,应该和NTLM的认证有关
        }
        //显示图像极大地挑战了我的认知,不知道我是不是用了个很别扭的方式在显示图像.
        //显示图像参考了http://blog.chinaunix.net/u2/60529/showart_1129802.html
        //要显示图像,首先要有一个图像,这里的QPixmap.
        //然后有个能够放到QGraphicsScene中的QGraphicsPixmapItem
        //自然要有个QGraphicsScene了,
        //把QGraphicsScene放入到QGraphicsView中才算显示完成....

        pixmap.load(file.fileName());
        QGraphicsScene scene;
        scene.addItem(new QGraphicsPixmapItem(pixmap));
        ui.graphicsView->setScene(&scene);
    }
};

#endif
//公司里面试不了~
//十一回家继续测试
源代码 FavIcon.rar (540 K) 下载次数:99
[ 此贴被wvins在2008-09-27 18:48重新编辑 ]
离线wvins
只看该作者 4楼 发表于: 2008-09-26
....
回复里面,不会发附件~
离线netlove

只看该作者 5楼 发表于: 2008-09-26
我也接触不长时间,半年,处于应该想办法提高自己的阶段,也是苦于没有好的思路,整天在公司里就是按公司规定的东西做,接触的范围少一些。希望能一起交流。不过我一直在用qte-2.3.10做嵌入式方面的应用。希望在工作之余多进行一些讨论,学习。
离线wvins
只看该作者 6楼 发表于: 2008-09-26
呵呵~
太感谢了,终于有人捧场了.
我现在都不知道编程能干什么了~
学QT纯粹是爱好,目前阶段就像做个跨平台的RSS阅读器出来.
反正也是朝着这个方向去的.

这个上面涉及到的东西不会太多,就是操作SQLite3数据库,和WebKit的操作
其他就是细节问题了,就比如彩色的树展现.
最好的情况是,能够用WebKit定制出一个浏览起来,不需要的东西,干脆都不取到本地来
不过离那一步还很远.

我个人比较倾向与做嵌入式,这玩意应该很火的啊
离线wvins
只看该作者 7楼 发表于: 2008-09-27
顶上去  
--
今天的任务是显示彩色的树,比如 频道A(10/100) ,频道A 和 (10/100)  用不同的颜色标志.
暂时不知道怎么画,就先找了个用QLabel来渲染的例子.
附件上不了,就贴代码吧
Ui生成的头文件就不贴了,就一个QTreeView
主程序一如既往的简单,main.cpp如下:
#include <QApplication>
#include "DlgColorTreeView.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    DlgColorTreeView dialog;
    dialog.show();
    return app.exec();
}
-----------------
我自己的窗体类,代码如下
#ifndef H_DLGCOLORTREEVIEW_H
#define H_DLGCOLORTREEVIEW_H
#include <QDialog>
#include <QLabel>
#include <QMessageBox>
#include <QStandardItemModel>
#include <QItemDelegate>
#include "ui_qtTreeView.h"

class MyItemDelegation: public QItemDelegate
{
public:
    MyItemDelegation(QObject *parent = 0):QItemDelegate(parent){}
    //我不理解这个构造函数是在什么地方调用的,
    //他的parent是在什么时候传过去的,
    //问题就出在这里,后面的Dynamic_cast出错
    //晕~只怪自己C++忘了太多

    virtual void paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
    {
        //QMessageBox::information(0, "", parent()->objectName());
        QAbstractItemView *view = dynamic_cast<QAbstractItemView*>(parent());
        if (view->indexWidget(index)==0)
        {
          QLabel *label = new QLabel;
          label->setAutoFillBackground(true);
          label->setText("<font color=red>aaa</font>");
          view->setIndexWidget(index,label);
        }
        else
            QItemDelegate::paint(painter,option,index);
    }
};

class DlgColorTreeView: public QDialog
{
    Q_OBJECT
private:
    Ui_Dialog dialog;
//    MyItemDelegation delegate;
MyItemDelegation *delegate;
public:
    DlgColorTreeView():QDialog()
    {
        dialog.setupUi(this);
        QStandardItemModel *model = new QStandardItemModel();
        QModelIndex parent;
        for (int i = 0; i < 4; ++i) {
            parent = model->index(0, 0, parent);
            model->insertRows(0, 1, parent);
            model->insertColumns(0, 1, parent);
            QModelIndex index = model->index(0, 0, parent);
            model->setData(index, "<h2><font color=blue>1</font><font color=blue>2</font><h2>");
        }
        dialog.treeView->setModel(model);
        delegate = new (dialog.treeView);
//        dialog.treeView->setItemDelegate(&delegate);
        dialog.treeView->setItemDelegate(delegate);
    }
};
#endif
-------------------------------
挖了两个坑了,不过不急,明天一并解决!
如果有人知道错误,还望指出来.
谢谢!
源代码 10.TreeView.rar (576 K) 下载次数:59
[ 此贴被wvins在2008-09-27 18:42重新编辑 ]
离线wvins
只看该作者 8楼 发表于: 2008-09-27
一不小心发现论坛的玄机,
原来修改以前的帖子就可以高级编辑了.
----
上面红色的部分是我修改的,现在能够正确显示彩色的文本了,
只是字体大小不大合适.凑合着能用了.
离线wvins
只看该作者 9楼 发表于: 2008-09-30
又被淹没了,顶上去

下载并显示图标的代码经过修改测试已经能够使用了,
不过在Linux下面遇到一些问题,详情(包括Windows环境下测试通过的代码)下面这个帖子:
http://www.qtcn.org/bbs/read.php?tid=13092
离线succulent
只看该作者 10楼 发表于: 2008-12-24
我最近也想做一个rss阅读器
是用在嵌入式平台上的,用qt3
但基础比较薄弱,得先突击一段时间再来和lz交流
其实qt做东西还是比较快的,个人感觉
离线wvins
只看该作者 11楼 发表于: 2008-12-24
我靠,
太不容易了。
居然给顶上来了。
现在做的差不多了,不过代码管理太乱了
有点控制不住了。。。
离线succulent
只看该作者 12楼 发表于: 2008-12-29
请教一下,你的思路是怎么样的呢
是用qt自带的xml函数来进行解析吗?
如果只借用qt的界面功能,用tinyxml或者libxml2来实现会不会更方便些
离线succulent
只看该作者 13楼 发表于: 2008-12-29
另外,通过什么途径来获得网络上的xml文件呢,socket?
离线wvins
只看该作者 14楼 发表于: 2008-12-29
我目前使用的是Qt自带的XML分析的,
LibXML和TinyXML没使用过,不熟悉。

目前,我使用的是QHttp和QNetworkProxy的方式获得XML文件,包括Icon。
但是对于有脚本的情况没有解决。
离线water_wf

只看该作者 15楼 发表于: 2008-12-29
算我一个,不过我要到处一个插件,呵呵
zhwsh00@126.com
离线wvins
只看该作者 16楼 发表于: 2008-12-29
Great
我想我应该把模块划分清楚,让感兴趣的人选择一个模块去开发。
------------
我的应用目前就是一个大的executable,嘿嘿
离线water_wf

只看该作者 17楼 发表于: 2008-12-29
引用第16楼wvins于2008-12-29 11:15发表的  :
Great
我想我应该把模块划分清楚,让感兴趣的人选择一个模块去开发。
------------
我的应用目前就是一个大的executable,嘿嘿

这样可不好,难以生存,相比于编程技巧,架构设计更重要
离线succulent
只看该作者 18楼 发表于: 2008-12-29
是的,划分好架构很重要

我由于以后可能还会移植到别的平台上,希望只是用qt做一个界面,其他底层实现用通用库
不知道有什么合适些的库可以用来获得xml文件
离线wvins
只看该作者 19楼 发表于: 2008-12-29
说的有道理,我刚开始做跨平台,
根本没有考虑到这一点。
--
有道理
离线wvins
只看该作者 20楼 发表于: 2008-12-29
[img] [/img]
离线wvins
只看该作者 21楼 发表于: 2008-12-29
秀秀我的Delphi版,嘿嘿
[img] [/img]
离线wvins
只看该作者 22楼 发表于: 2009-03-15
值得纪念的一天!
我的QT版RSS阅读器实现了基本功能,在整理一下代码修正些显而易见的Bug就是一款Alpha版了。

:)
离线xhylyx
只看该作者 23楼 发表于: 2009-03-20
帮你顶一下,继续加油
离线wvins
只看该作者 24楼 发表于: 2009-03-20
源代码与二进制文件 QtRSSReader.rar (774 K) 下载次数:35 目前在分析QNetworkAccessManager的源代码,有点头大。
代码就不加整理了,大概说下目录结构:

dlgAbout -------------关于对话框
dlgAddSubscribe-------------添加订阅对话框
dlgConfigBackgroundUpdate-----------------后台更新配置对话框
dlgConfigProxy----------------代理配置对话框
dlgInput--------------一个简单的录入对话框
FrameRSSItems-------------------新闻列表Widget
FrameWebBrowser-----------------浏览器Widget
FrmMain-------------主程序,总集成目录。 
        release-------------发行文件,可执行文件,配置文件,数据库文件。
ICON----------------图标资源文件夹
lib------------------数据库访问公共单元
Resources.qrc-------------------Qt资源文件
QtRSSReader.pro------------------无效的Qt Project文件

==================================
目前能够实现基本的浏览功能,不过存在下面几个问题:
1. 添加完订阅没有更新树的展现。---------这个技术上已经没有什么难题,只是需要些时间调整一下设计。
2. 已读新闻的更新没有更新到数据库。-------------我可能会修改Model的更新方式,所以暂时没有添加这句代码。

==================================
在Windows XP sp3,MingW,Qt4.4.3下编译通过。
离线wvins
只看该作者 25楼 发表于: 2009-04-11
QtRSSReader Alpha 2.0代码结构

$dlgAbout -------------关于对话框
$dlgAddSubscribe-------------添加订阅对话框
$dlgConfigBackgroundUpdate-----------------后台更新配置对话框
$dlgConfigProxy----------------代理配置对话框
$dlgInput--------------一个简单的录入对话框
$FrameOnline---------------资料管理Widget,后续开发的模块化分
$FrameRSSItems-------------------新闻列表Widget
$FrameWebBrowser-----------------浏览器Widget
$FrmMain-------------主程序,总集成目录。
$release-------------发行文件,可执行文件,配置文件,数据库文件。
$ICON----------------图标资源文件夹
$lib------------------数据库访问公共单元
Resources.qrc-------------------Qt资源文件

==================================
这个版本实现了完备的功能,修改了上个版本的部分Bug:
        更新已读到数据库
        修改Proxy的使用方式,解决proxy释放出错的Bug
        完善了添加订阅和更新功能
        对代码结构进行部分调整——主要是把对于订阅的维护代码独立出来
      
尚待解决的问题:
        彩色树和多层树展现
        网页浏览基本功能实现
        删除节点报错Bug
        下载失败的处理,
       XML格式错误的处理
      
稍后补上QtRSSReader Alpha 3.0开发计划。
==================================
在Windows XP sp3,MingW,Qt4.5.0下编译通过。

源代码 QtRSSReader.rar (299 K) 下载次数:25
离线wvins
只看该作者 26楼 发表于: 2009-04-27
经过三天的折腾,终于搞定了树的展现,这三天来主要完成了以下功能:
1. 无限层树的构造
2. 彩色树的展现(彩色表示未读/全部信息)
3. 使用Style Sheet调整格式(完全是抄的例子)
4. 树的级联删除功能
5. 树的级联更新功能
6. 为不提供Favicon的订阅添加默认图标显示
7. 解决了SQLite语法差异导致的树显示问题
8. 修改了保存到数据库中的Feed网址信息。

=============================
在这个过程中,我有点后悔使用QTreeView而不是用QTreeWidget了,
由于对整体框架认识还不充分,导致我在开发过程中东拉西扯的修修补补,最终代码惨不忍睹。

离线wvins
只看该作者 27楼 发表于: 2009-05-17
源代码 QtRSSReader.rar (470 K) 下载次数:37 今天花了点时间完成了RSS阅读器的双击打开Tab页浏览的功能,
 
能够双击关闭Tab页,
没有处理代理服务器的情况,
不具备浏览器的链接跳转功能,只能以只读方式查看。
 
新增目录如下:
FrameRSSBrowser                -----右侧内容展现Widget,用于管理新闻列表和打开的FramePage
FramePage                              -----以分组为单位的单页面,目前仅实现了无代理情况下的新闻展现
Output                                        -----输出路径

由于使用了静态链接的方式,在动态链接环境下可能需要对代码做部分修改。
离线shiroki

只看该作者 28楼 发表于: 2009-05-20
数据库用sqlite吧
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线shiroki

只看该作者 29楼 发表于: 2009-05-20
代码的pro里把文件的名字给写错了哦, 不知道楼主是怎么编译通过的亚?? 是不是只能在VC里编译? 能不能上载一个可以在linux下编译运行的版本?
[ 此帖被shiroki在2009-05-20 17:45重新编辑 ]
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线gvim
只看该作者 30楼 发表于: 2009-05-20
报告楼主,因为你在windows里编译,出现了很多文件名大小混用的情况,在Linux没法编译。
不过我改啊改,能编译了,主界面也出来了,但是加不了频道:(

我把改动后的Linux代码发上来吧~ QtRSSReader.tgz (730 K) 下载次数:27

在 FrmMain目录下qmake,make就可以了。
Qt,Qt! 分享Cute之Qt体验
欢迎访问 http://www.cuteqt.com
欢迎订阅 http://www.cuteqt.com/?feed=rss2

离线wvins
只看该作者 31楼 发表于: 2009-05-21
哈哈,谢谢捧场。
另外,谢谢你帮忙修改文件名的大小写

不能添加频道大概是因为设置了Proxy。你可以在设置里面取消Proxy的设置。

因为Proxy导致的网络访问失败,没有返回信息,所以没有弹出出错对话框。
离线wvins
只看该作者 32楼 发表于: 2009-05-30
关于Model-View方式导致的程序异常,及解决方案记录。
也希望有经验的同志能给点意见。


这样QTableView就加入了selectionChanged的支持,以及Sort和Filter的支持。

今天在使用中发现,SortFilterProxyModel和ListModel的行为不太一致,导致程序异常。

我的数据通过ListModel的addItems方法添加。
奇怪的是,ListModel的rowCount和SortFilterProxyModel的rowCount存在差距,SortFilterProxyModel的rowCount始终多2个。
这就导致拉动QTableView的滚动条,滚动到不存在的记录时,程序异常退出。
---------------------
无奈之下,使用了下面变态的解决方案,在addItems的结尾重新设置下源Model
proxyModel->setSourceModel(rssModel);
。。。
---------------------
看到这个图有个想法,大概我的addItems在一个错误的地点实现了。
或许应该在SortFilterProxyModel中提供这个功能,因为他才QTableView实际的Model。

---------------------

BTW:
我修改了addItems的实现,在改变之前是没有这么严重的Bug~
原实现如下(单条插入的方式):
void ListModel::addItem(ListItem *item)
{
 beginInsertRows(QModelIndex(), rssItems->count(), rssItems->count());
 rssItems->append(item);
 endInsertRows();
}

新的实现(批量插入):
void ListModel::addItems(QSqlQuery &query)
{
 int querySize = 0;
 while(query.next() && ++querySize);
 
 ListItem *item;
 beginInsertRows(QModelIndex(), 0, querySize);
 query.seek(-1);
 while (query.next())
 {
  item = new ListItem;
  item->setValue(query.record());
  rssItems->append(item);
 }
 endInsertRows();
}
[ 此帖被wvins在2009-05-30 21:48重新编辑 ]
离线channon
只看该作者 33楼 发表于: 2009-09-30
http://www.qtcn.org/bbs/read.php?tid=18732&keyword=rss

这个开源项目不知道还在不在维护了
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线wvins
只看该作者 34楼 发表于: 2009-10-15
那个你可以上他们的网站上去看看,
QtRSSReader断断续续的在修改一些Bug,美化,不过改动不大。
离线neil-wen

只看该作者 35楼 发表于: 2013-08-18
不错,值得顶一下
快速回复
限100 字节
 
上一个 下一个