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


  现在,我们要开始编写自己的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_())

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


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐