使用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_())
程序运行时,我们发现,如果调整窗体的大小,窗体中的组件的大小也随之调整,非常合理。