From a2cf69f30a387e6409e145c4f6759d290aed9b23 Mon Sep 17 00:00:00 2001 From: Irony <892768447@qq.com> Date: Mon, 9 Apr 2018 00:47:30 +0800 Subject: [PATCH] =?UTF-8?q?json=E7=94=9F=E6=88=90QTreeWidget=20#10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 2 + json生成QTreeWidget/README.md | 8 ++ json生成QTreeWidget/ScreenShot/1.png | Bin 0 -> 9136 bytes json生成QTreeWidget/data.json | 56 ++++++++ json生成QTreeWidget/json生成树形结构.py | 152 +++++++++++++++++++++ json生成QTreeWidget/weixin.png | Bin 0 -> 1749 bytes 6 files changed, 218 insertions(+) create mode 100644 json生成QTreeWidget/README.md create mode 100644 json生成QTreeWidget/ScreenShot/1.png create mode 100644 json生成QTreeWidget/data.json create mode 100644 json生成QTreeWidget/json生成树形结构.py create mode 100644 json生成QTreeWidget/weixin.png diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index e09efca..704e1f1 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -14,6 +14,7 @@ encoding//QGraphicsView\u7EC3\u4E60/\u6DFB\u52A0QWidget.py=utf-8 encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImagePs.py=utf-8 encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImageThread.py=utf-8 encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImageView.py=utf-8 +encoding//json\u751F\u6210QTreeWidget/json\u751F\u6210\u6811\u5F62\u7ED3\u6784.py=utf-8 encoding//tmp/LocalClient.py=utf-8 encoding//tmp/Material/Effect/LineEffect.py=utf-8 encoding//tmp/Material/Utils/Colors.py=utf-8 @@ -22,6 +23,7 @@ encoding//tmp/Material/Widget/LineEdit.py=utf-8 encoding//tmp/Material/test/TestLineEdit.py=utf-8 encoding//tmp/QtServer.py=utf-8 encoding//tmp/error.py=utf-8 +encoding//tmp/json\u751F\u6210\u6811\u5F62\u7ED3\u6784.py=utf-8 encoding//tmp/\u622A\u56FE\u753B\u77E9\u5F62/DrawRectangle.py=utf-8 encoding//tmp/\u7B80\u5355\u63D2\u4EF6/Widget.py=utf-8 encoding//tmp/\u8BFB\u53D6\u526A\u5207\u677F\u56FE\u7247.py=utf-8 diff --git a/json生成QTreeWidget/README.md b/json生成QTreeWidget/README.md new file mode 100644 index 0000000..fd8a3b6 --- /dev/null +++ b/json生成QTreeWidget/README.md @@ -0,0 +1,8 @@ +# 通过json数据生成QTreeWidget树形结构 + +### [Python3.4.4 or Python3.5][PyQt5] + +emmmmmm,原理就是那样,,解析每一层json数据中的list,美化就不想弄了. + +# 截图 +![截图1](ScreenShot/1.png) \ No newline at end of file diff --git a/json生成QTreeWidget/ScreenShot/1.png b/json生成QTreeWidget/ScreenShot/1.png new file mode 100644 index 0000000000000000000000000000000000000000..de747a67fb6255159f4404e6cd91033762a8d249 GIT binary patch literal 9136 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 F{{Z#?Hah?S literal 0 HcmV?d00001 diff --git a/json生成QTreeWidget/data.json b/json生成QTreeWidget/data.json new file mode 100644 index 0000000..09f79a1 --- /dev/null +++ b/json生成QTreeWidget/data.json @@ -0,0 +1,56 @@ +[ + { + "name": "仪表盘", + "icon": "xxx.png" + }, + { + "name": "微信管理", + "icon": "weixin.png", + "badge": [ + "火爆", + "#F8AC54" + ], + "items": [ + { + "name": "爬虫项目管理", + "icon": "xxx.png", + "badge": [ + "推荐", + "#23C6C9" + ], + "items": [ + { + "name": "腾讯课堂" + }, + { + "name": "淘宝" + }, + { + "name": "京东" + }, + { + "name": "天猫" + }, + { + "name": "拉钩" + }, + { + "name": "BOSS直聘" + } + ] + } + ] + }, + { + "name": "爬虫部署管理", + "icon": "xxx.png" + }, + { + "name": "爬虫监控管理", + "icon": "xxx.png" + }, + { + "name": "PyQt", + "url": "https://github.com/892768447/PyQt" + } +] diff --git a/json生成QTreeWidget/json生成树形结构.py b/json生成QTreeWidget/json生成树形结构.py new file mode 100644 index 0000000..3c23b51 --- /dev/null +++ b/json生成QTreeWidget/json生成树形结构.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Created on 2018年4月8日 +@author: Irony +@site: https://github.com/892768447 +@email: 892768447@qq.com +@file: +@description: +""" +import json +import webbrowser + +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QWidget,\ + QLabel, QSpacerItem, QSizePolicy, QHBoxLayout +import chardet + + +__Author__ = """By: Irony +QQ: 892768447 +Email: 892768447@qq.com""" +__Copyright__ = "Copyright (c) 2018 Irony" +__Version__ = "Version 1.0" + + +class ItemWidget(QWidget): + """自定义的item""" + + def __init__(self, text, badge, *args, **kwargs): + super(ItemWidget, self).__init__(*args, **kwargs) + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(QLabel(text, self, styleSheet='color: white;')) + layout.addSpacerItem(QSpacerItem( + 60, 1, QSizePolicy.Maximum, QSizePolicy.Minimum)) + if badge and len(badge) == 2: # 后面带颜色的标签 + layout.addWidget(QLabel( + badge[0], self, alignment=Qt.AlignCenter, + styleSheet="""min-width: 80px; + max-width: 80px; + min-height: 38px; + max-height: 38px; + color: white; + border:none; + border-radius: 4px; + background: %s""" % badge[1] + )) + + +class JsonTreeWidget(QTreeWidget): + + def __init__(self, *args, **kwargs): + super(JsonTreeWidget, self).__init__(*args, **kwargs) + self.setEditTriggers(self.NoEditTriggers) + self.header().setVisible(False) + # 帮点单击事件 + self.itemClicked.connect(self.onItemClicked) + + def onItemClicked(self, item): + """item单击事件""" + if item.url: # 调用浏览器打开网址 + webbrowser.open_new_tab(item.url) + + def parseData(self, datas, parent=None): + """解析json数据""" + for data in datas: + url = data.get('url', '') + items = data.get('items', []) + # 生成item + _item = QTreeWidgetItem(parent) + _item.setIcon(0, QIcon(data.get('icon', ''))) + _widget = ItemWidget( + data.get('name', ''), + data.get('badge', []), + self + ) + _item.url = url # 可以直接设置变量值 + self.setItemWidget(_item, 0, _widget) + if url: + continue # 跳过 + # 解析儿子 + if items: + self.parseData(items, _item) + + def loadData(self, path): + """加载json数据""" + datas = open(path, 'rb').read() + datas = datas.decode(chardet.detect(datas).get('encoding', 'utf-8')) + self.parseData(json.loads(datas), self) + + +if __name__ == '__main__': + import sys + from PyQt5.QtWidgets import QApplication + app = QApplication(sys.argv) + app.setStyleSheet("""QTreeView { + outline: 0px; + background: rgb(47, 64, 78); +} +QTreeView::item { + min-height: 92px; +} +QTreeView::item:hover { + background: rgb(41, 56, 71); +} +QTreeView::item:selected { + background: rgb(41, 56, 71); +} + +QTreeView::item:selected:active{ + background: rgb(41, 56, 71); +} +QTreeView::item:selected:!active{ + background: rgb(41, 56, 71); +} + +QTreeView::branch:open:has-children { + background: rgb(41, 56, 71); +} + +QTreeView::branch:has-siblings:!adjoins-item { + background: green; +} +QTreeView::branch:closed:has-children:has-siblings { + background: rgb(47, 64, 78); +} + +QTreeView::branch:has-children:!has-siblings:closed { + background: rgb(47, 64, 78); +} + +QTreeView::branch:open:has-children:has-siblings { + background: rgb(41, 56, 71); +} + +QTreeView::branch:open:has-children:!has-siblings { + background: rgb(41, 56, 71); +} +QTreeView:branch:hover { + background: rgb(41, 56, 71); +} +QTreeView:branch:selected { + background: rgb(41, 56, 71); +} + """) + w = JsonTreeWidget() + w.show() + w.loadData('data.json') + sys.exit(app.exec_()) diff --git a/json生成QTreeWidget/weixin.png b/json生成QTreeWidget/weixin.png new file mode 100644 index 0000000000000000000000000000000000000000..a44dbab418d4054ff75321a8a6411f5897b33dab GIT binary patch literal 1749 zcmV;`1}gc9P)$2W($xyOYVe?RERsx7J=`we?&K9LIrY+X#XH z#bOb@?<3}V;IietWm%}IszOao4Js=uvA({J&CN|LFE67|DCj=!u^b!ud|vMZk;~oGJmgxB`fMw{q} z>$-YRqjcC62Yh)iACX8TG<97aomgCYj`W{t5OK@4cI5<@?N~Ol8yStDwzd|ZeDpEO zytr8OVfg{*BJUGk47uzk%Hs)*nm({RMB+G#|mCx_XT+E<|KCJbn5UGc(gzSeVEB{Ja{WVx}pZ-azX9 zeJn{TCMPEqHOkQ$a_P+5?`&685LTb2Sdfp29@^ydD;!~^y!Y-IS{6S zp{}k@qoy*WkSNyF?9=b3PoGwfs9`ZgSvvC|l|nHH4O+^B&;g>#eOesytj;FiAJ9JX z<>y~u@7}$da~d-q^XHTl@IBL3St?8Ns)#VE>FH@qP5lAW4tQmNFJHdI{PRVuuCA(K z(W-L1=Qk2vIYI*_0&cK{yyOHoG7VJ7T+=usVdR9L-wP7$+R6%U-1tcd+J>`dV~ z%VpBDxVVU)e-Td2&cYUcQ3p9^(&IE7>lmgpCzIW3l*FRf3Es;lIz=bwj6o>uoEFB% z$B|0?hI73aaO7}v6e%5Ml@;U~mn#i3(37W5p}e9TvrlH>2;p6Fu9O;^Xi#uzX(=*9 zNa=t<%d~2ir%4gXJ2^Rl4=(nhdQY_ym~tkSl;Jz-)&gMX&Sddc_bChv45%KW5>*X1 zQt`xX8D0}3x2S9&vp^-MbKtR=$I7-d%^eHm$T zrpvaqyn&vco~TKxBjzS041clqB4n^Aq7%$7BQ%`gJ+Ex%b#(_+QIHRh07r8A?bqMn z(xtC7at1=f3kwUla^*6vUAv}*U=CFx!<0vkn3m1!=;$am3pw~UG;;EQ(L1paaw;y$ zne=#S8eMO8gcZgfA!%ll>um2pcUKaX!iP8=7lZrc#6EWP7*3ox5mtv4odyFY_Dz{@UdV71dUvNKl5>@i5U-bDq zxThs9`>2D>js;>D{Gv7;?FpiQ-SoT5mo?{3+>6LdgjlY;*M=mEN-4+1cbdvDw^38% zqBEvnP*2_u)5G@>B8C%OCPg%6+adGgju(vr6s98f5;~zA+0pcj9vuNnrBBqzv4Wy% zY5DS*G90X;!DuH(a$Dh{)zH+)pyZsH!QH!eHBz3;oY3gl@{1MB%sxR!M@Kl3372xk zfphI}`VlbYF zvxYSPj7+RzP3Bfd6gM7fP{&QVyHa6}q-;yzSBF@2@?0qOCOVuNdw^TFZfR=$Qj52l zZ#E%rpc7`9a%Dtj?$qO7_A1o!?e^{4xG$rCLC7>L&N19;s>dM4V8^E>ar5R))o)0z zh}1S6AGTPcK^U=BI!kssWS*6juA{?qI15^MB3xOOMpz~!tg7Cl!?O}wv=MgGUD=;p zL2cywk?`EII7)8Mv)euPKQ2bf!;i$?zkffDHZ|+j6u_D|$xhtRd{~>>!Gi~t8%(7c z#I@2m#s3?_#ecjA%aXG%mnmme&i^|6hfoMBihZN;aFfg}Q&C#X-v5n=4m&)`{p}H9 r=U)guvl_`88FujS;lqeOTxRcI+Wz?15psRa00000NkvXXu0mjfz^YAS literal 0 HcmV?d00001