欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Python编写RSS阅读器(三)

程序员文章站 2024-01-20 21:05:10
...

使用Python编写RSS阅读器(三)


  现在,我们要开始编写自己的RSS阅读器啦!


  我们的界面预计是这样的:

使用Python编写RSS阅读器(三)


  左边使用QTreeView,显示RSS订阅源,右边使用QWebView,显示网页内容。


  下面是程序代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import sys


class TreeDemo(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        # 使用字典保存所有小图标,字典数据由键、值对构成
        iconMap = {}
        iconMap[QString('x1')] = QIcon(QString('icons/x1.ico'))
        iconMap[QString('x2')] = QIcon(QString('icons/x2.ico'))
        iconMap[QString('x3')] = QIcon(QString('icons/x3.ico'))
        iconMap[QString('x4')] = QIcon(QString('icons/x4.ico'))
        iconMap[QString('x5')] = QIcon(QString('icons/x5.ico'))

        gridLayout = QGridLayout()
        gridLayout.setHorizontalSpacing(10)
        gridLayout.setVerticalSpacing(10)
        gridLayout.setContentsMargins(10, 10, 10, 10)

        # 左边是QTreeView
        treeView = QTreeView()
        # QTreeView使用固定宽度
        treeView.setFixedWidth(500)

        # QStandardItemModel是树状视图的数据模型
        # 模型与视图是分离的,我们只需维护模型
        # 使用treeView作为model的parent,这样treeView释放时会销毁model
        model = QStandardItemModel(treeView)

        # 添加树状视图的表头
        headers = QStringList()
        headers.append(QString(u'RSS订阅源'))
        headers.append(QString(u'URL'))
        model.setHorizontalHeaderLabels(headers)

        # 为视状视图添加5个数据项,其中item1~3是平级的,item4是挂在item3之下,item5是挂在item4之下
        item1 = QStandardItem(iconMap[QString('x1')], QString(u'微软亚洲研究院'))
        model.appendRow(item1)
        # 使用model.setItem可以添加第2列的信息
        # 0, 1表示第0行,第1列
        # 为了编程方便,也可以写成:
        # model.setItem(model.indexFromItem(item1).row(), 1, ...)
        model.setItem(0, 1, QStandardItem(
            QString('http://blog.sina.com.cn/rss/1286528122.xml')))

        item2 = QStandardItem(iconMap[QString('x2')], QString(u'知乎每日精选'))
        model.appendRow(item2)
        model.setItem(1, 1, QStandardItem(
            QString('http://www.zhihu.com/rss')))

        item3 = QStandardItem(iconMap[QString('x3')], QString(u'爱范儿'))
        model.appendRow(item3)
        model.setItem(2, 1, QStandardItem(
            QString('http://www.ifanr.com/feed')))

        item4 = QStandardItem(iconMap[QString('x4')], QString(u'柴静'))
        item3.appendRow(item4)
        # item.setChild作用与model.setItem相近
        # 0, 1表示第0行,第1列
        item3.setChild(0, 1, QStandardItem(
            QString('http://blog.sina.com.cn/rss/1219548027.xml')))

        item5 = QStandardItem(iconMap[QString('x5')], QString(u'小众软件'))
        item4.appendRow(item5)
        item4.setChild(0, 1, QStandardItem(
            QString('http://www.appinn.com/feed/')))

        # 为树状视图设置模型,这里将模型与视图关联起来
        treeView.setModel(model)

        gridLayout.addWidget(treeView, 0, 0, 1, 1)

        # 右边是QWebView,QWebView可用于显示网页
        webView = QWebView()
        webView.load(QUrl('https://www.baidu.com'))

        gridLayout.addWidget(webView, 0, 1, 1, 1)

        self.setLayout(gridLayout)

        self.setGeometry(100, 100, 1200, 600)
        self.setWindowTitle(u'RSS阅读器')


app = QApplication(sys.argv)
treeDemo = TreeDemo()
treeDemo.show()
sys.exit(app.exec_())

  程序运行时,我们发现,如果调整窗体的大小,窗体中的组件的大小也随之调整,非常合理。