From 3bce346dce9c5580adc4cf0a7500362439464255 Mon Sep 17 00:00:00 2001 From: 892768447 <892768447@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:47:11 +0000 Subject: [PATCH] deploy: c4ada06df7f35f684230b7316455dcadd92457ab --- .nojekyll | 0 404.html | 270 + CNAME | 1 + QPropertyAnimation.html | 435 ++ about/index.html | 292 ++ ads.txt | 1 + animateshadow.html | 406 ++ archives/2018/09/index.html | 276 + archives/2018/10/index.html | 276 + archives/2018/11/index.html | 276 + archives/2018/index.html | 276 + archives/2018/page/2/index.html | 276 + archives/2019/01/index.html | 276 + archives/2019/02/index.html | 276 + archives/2019/03/index.html | 276 + archives/2019/04/index.html | 276 + archives/2019/05/index.html | 276 + archives/2019/07/index.html | 276 + archives/2019/08/index.html | 276 + archives/2019/12/index.html | 276 + archives/2019/index.html | 276 + archives/2019/page/2/index.html | 276 + archives/2019/page/3/index.html | 276 + archives/2023/10/index.html | 276 + archives/2023/index.html | 276 + archives/2024/04/index.html | 276 + archives/2024/index.html | 276 + archives/index.html | 276 + archives/page/2/index.html | 276 + archives/page/3/index.html | 276 + archives/page/4/index.html | 276 + archives/page/5/index.html | 276 + atom.xml | 508 ++ baidusitemap.xml | 167 + bindsignals.html | 314 ++ calljava.html | 372 ++ categories/index.html | 278 + .../\344\276\213\345\255\220/index.html" | 443 ++ .../page/2/index.html" | 362 ++ .../\346\225\231\347\250\213/index.html" | 426 ++ .../\347\254\224\350\256\260/index.html" | 437 ++ .../\351\232\217\347\254\224/index.html" | 417 ++ "category/\344\276\213\345\255\220/feed.json" | 174 + "category/\344\276\213\345\255\220/rss.xml" | 1758 +++++++ "category/\346\225\231\347\250\213/feed.json" | 108 + "category/\346\225\231\347\250\213/rss.xml" | 591 +++ "category/\347\254\224\350\256\260/feed.json" | 105 + "category/\347\254\224\350\256\260/rss.xml" | 647 +++ "category/\351\232\217\347\254\224/feed.json" | 106 + "category/\351\232\217\347\254\224/rss.xml" | 426 ++ cgitb.html | 298 ++ circleimage.html | 434 ++ css/index.css | 4645 +++++++++++++++++ css/var.css | 0 daemonthread.html | 313 ++ datawidgetmapper_625781186.html | 378 ++ equal_str_width_625781186.html | 287 + faq/index.html | 356 ++ favicon.ico | Bin 0 -> 1150 bytes feed.json | 231 + ffmpeghls.html | 339 ++ ...6\350\247\222\351\230\264\345\275\261.zip" | Bin 0 -> 40345 bytes ...37\346\210\220\346\212\245\350\241\250.7z" | Bin 0 -> 9381900 bytes flipwidgetanimation.html | 341 ++ followwindow.html | 350 ++ guestbook/index.html | 276 + images/1.gif | Bin 0 -> 29178 bytes images/1240_thumb.jpg | Bin 0 -> 1627 bytes images/1_thumb.jpg | Bin 0 -> 2452 bytes images/2.gif | Bin 0 -> 39387 bytes images/5ce793171984f27031_thumb.jpg | Bin 0 -> 1051 bytes images/ClickJumpSlider_thumb.jpg | Bin 0 -> 1062 bytes images/FlipWidgetAnimation_thumb.jpg | Bin 0 -> 1736 bytes images/FollowWindow_thumb.jpg | Bin 0 -> 1968 bytes images/FramelessDialog1_thumb.jpg | Bin 0 -> 1429 bytes images/ImageSlipped_thumb.jpg | Bin 0 -> 2271 bytes images/IsSignalConnected_thumb.jpg | Bin 0 -> 1691 bytes images/JsSignals_thumb.jpg | Bin 0 -> 1485 bytes images/MultiSelect_thumb.jpg | Bin 0 -> 1905 bytes images/NinePatchImage_thumb.jpg | Bin 0 -> 1049 bytes images/PageSwitching_thumb.jpg | Bin 0 -> 1653 bytes images/PyQt_Group.png | Bin 0 -> 207896 bytes images/PyQt_Guild.png | Bin 0 -> 97364 bytes images/QPropertyAnimation.gif | Bin 0 -> 365023 bytes images/QPropertyAnimation_thumb.jpg | Bin 0 -> 1240 bytes images/RlatticeEffect_thumb.jpg | Bin 0 -> 1074 bytes images/ShadowEffect_thumb.jpg | Bin 0 -> 1364 bytes images/ShowFrameWhenDrag_thumb.jpg | Bin 0 -> 772 bytes images/avatar.png | Bin 0 -> 26199 bytes images/bg-2.jpg | Bin 0 -> 20934 bytes images/calljava.png | Bin 0 -> 31389 bytes images/calljava_thumb.jpg | Bin 0 -> 1073 bytes images/circleimage1.png | Bin 0 -> 57070 bytes images/circleimage1_thumb.jpg | Bin 0 -> 2258 bytes images/circleimage2.png | Bin 0 -> 56580 bytes images/datawidgetmapper.gif | Bin 0 -> 139933 bytes images/datawidgetmapper_thumb.jpg | Bin 0 -> 1301 bytes images/default_thumb.jpg | Bin 0 -> 5200 bytes images/desiger_create_thumb.jpg | Bin 0 -> 1230 bytes images/editor1.png | Bin 0 -> 196140 bytes images/editor1_thumb.jpg | Bin 0 -> 1933 bytes images/editor2.png | Bin 0 -> 51982 bytes images/editor3.png | Bin 0 -> 105270 bytes images/editor4.png | Bin 0 -> 66105 bytes images/editor5.png | Bin 0 -> 27251 bytes images/editor6.png | Bin 0 -> 47824 bytes images/editor_env.png | Bin 0 -> 69449 bytes images/editor_import.png | Bin 0 -> 46046 bytes images/editor_import2.png | Bin 0 -> 31152 bytes images/editor_tab.png | Bin 0 -> 48541 bytes images/editor_tpl.png | Bin 0 -> 97012 bytes images/howtoviewapi1.png | Bin 0 -> 23539 bytes images/howtoviewapi1_thumb.jpg | Bin 0 -> 1127 bytes images/howtoviewapi2.png | Bin 0 -> 30812 bytes images/howtoviewapi3.png | Bin 0 -> 69985 bytes images/howtoviewapi4.png | Bin 0 -> 32049 bytes images/howtoviewapi5.png | Bin 0 -> 50851 bytes images/howtoviewapi6.png | Bin 0 -> 39930 bytes images/howtoviewapi7.png | Bin 0 -> 35389 bytes images/howtoviewapi8.png | Bin 0 -> 69504 bytes images/macpyqtstep1.png | Bin 0 -> 90709 bytes images/macpyqtstep2.png | Bin 0 -> 112280 bytes images/macpyqtstep3.png | Bin 0 -> 66501 bytes images/material-10_thumb.jpg | Bin 0 -> 1391 bytes images/material-1_thumb.jpg | Bin 0 -> 1601 bytes images/material-2_thumb.jpg | Bin 0 -> 1474 bytes images/material-3_thumb.jpg | Bin 0 -> 1231 bytes images/material-4_thumb.jpg | Bin 0 -> 1087 bytes images/material-5_thumb.jpg | Bin 0 -> 1359 bytes images/material-6_thumb.jpg | Bin 0 -> 1275 bytes images/material-7_thumb.jpg | Bin 0 -> 1542 bytes images/material-8_thumb.jpg | Bin 0 -> 1633 bytes images/material-9_thumb.jpg | Bin 0 -> 1155 bytes images/processinclass1.png | Bin 0 -> 126783 bytes images/processinclass1_thumb.jpg | Bin 0 -> 1157 bytes images/processinclass2.png | Bin 0 -> 123068 bytes images/pyqt5asyncio.gif | Bin 0 -> 3318994 bytes images/pyqt5asyncio_thumb.jpg | Bin 0 -> 1293 bytes images/runnablesignal1.png | Bin 0 -> 136834 bytes images/runnablesignal1_thumb.jpg | Bin 0 -> 1247 bytes images/runnablesignal2.png | Bin 0 -> 20880 bytes images/runnablesignal3.png | Bin 0 -> 49999 bytes images/studynotes/desiger_create.png | Bin 0 -> 11622 bytes images/studynotes/desiger_drag.png | Bin 0 -> 4940 bytes images/studynotes/desiger_layout.png | Bin 0 -> 51737 bytes images/studynotes/desiger_property.png | Bin 0 -> 10038 bytes images/studynotes/desiger_property2.png | Bin 0 -> 15372 bytes images/studynotes/desiger_signal.png | Bin 0 -> 12349 bytes images/studynotes/desiger_signal2.png | Bin 0 -> 25175 bytes images/studynotes/desiger_stack.png | Bin 0 -> 4409 bytes images/viewpyindesigner1.jpg | Bin 0 -> 116289 bytes images/viewpyindesigner1_thumb.jpg | Bin 0 -> 1515 bytes images/viewpyindesigner2.jpg | Bin 0 -> 78236 bytes images/viewpyindesigner3.jpg | Bin 0 -> 224653 bytes images/weixin.png | Bin 0 -> 57464 bytes images/wxblog.jpg | Bin 0 -> 36413 bytes images/zhifubao.png | Bin 0 -> 24869 bytes img/404.jpg | Bin 0 -> 16393 bytes img/favicon.png | Bin 0 -> 323 bytes img/friend_404.gif | Bin 0 -> 65097 bytes index.html | 488 ++ issignalconnected.html | 346 ++ issues/index.html | 367 ++ js/main.js | 879 ++++ js/search/algolia.js | 177 + js/search/local-search.js | 364 ++ js/tw_cn.js | 122 + js/utils.js | 296 ++ jumpslider.html | 371 ++ likehtmleffect.html | 363 ++ link/index.html | 306 ++ macm1pyqt.html | 291 ++ mselectmenu.html | 372 ++ page/2/index.html | 466 ++ page/3/index.html | 471 ++ page/4/index.html | 514 ++ page/5/index.html | 331 ++ pageswitching.html | 315 ++ plugins/css/history.css | 99 + plugins/css/netease.css | 339 ++ plugins/css/special.css | 1294 +++++ plugins/font/style3.css | 156 + plugins/heart/images/web_heart_animation.png | Bin 0 -> 11544 bytes plugins/heart/style.css | 112 + plugins/hint/hint.min.css | 5 + plugins/images/bottom.png | Bin 0 -> 2326 bytes plugins/images/clock.png | Bin 0 -> 1687 bytes plugins/images/date.png | Bin 0 -> 2928 bytes plugins/images/footprint.png | Bin 0 -> 4591 bytes plugins/images/icons.png | Bin 0 -> 298 bytes plugins/images/icons2.png | Bin 0 -> 3667 bytes plugins/images/icons3.png | Bin 0 -> 3683 bytes plugins/images/point.png | Bin 0 -> 969 bytes plugins/images/top.png | Bin 0 -> 2374 bytes plugins/images/vertical.png | Bin 0 -> 1012 bytes plugins/js/easying.js | 205 + plugins/js/gotop.js | 66 + plugins/js/history.js | 112 + plugins/js/jquery.bumpytext.packed.js | 14 + plugins/js/jquery.easing.js | 44 + plugins/js/jquery.js | 154 + plugins/js/jquery.lazyload.min.js | 2 + plugins/js/jquery.mousewheel.js | 12 + plugins/js/scrollHighlight.js | 163 + plugins/prettify/lang-apollo.js | 53 + plugins/prettify/lang-basic.js | 49 + plugins/prettify/lang-clj.js | 64 + plugins/prettify/lang-css.js | 160 + plugins/prettify/lang-dart.js | 92 + plugins/prettify/lang-erlang.js | 94 + plugins/prettify/lang-go.js | 59 + plugins/prettify/lang-hs.js | 102 + plugins/prettify/lang-lasso.js | 67 + plugins/prettify/lang-lisp.js | 95 + plugins/prettify/lang-llvm.js | 63 + plugins/prettify/lang-logtalk.js | 50 + plugins/prettify/lang-lua.js | 60 + plugins/prettify/lang-matlab.js | 183 + plugins/prettify/lang-ml.js | 57 + plugins/prettify/lang-mumps.js | 140 + plugins/prettify/lang-n.js | 67 + plugins/prettify/lang-pascal.js | 49 + plugins/prettify/lang-proto.js | 37 + plugins/prettify/lang-r.js | 59 + plugins/prettify/lang-rd.js | 50 + plugins/prettify/lang-rust.js | 81 + plugins/prettify/lang-scala.js | 56 + plugins/prettify/lang-sql.js | 59 + plugins/prettify/lang-swift.js | 58 + plugins/prettify/lang-tcl.js | 63 + plugins/prettify/lang-tex.js | 49 + plugins/prettify/lang-vb.js | 67 + plugins/prettify/lang-vhdl.js | 51 + plugins/prettify/lang-wiki.js | 55 + plugins/prettify/lang-xq.js | 69 + plugins/prettify/lang-yaml.js | 45 + plugins/prettify/prettify-default.css | 70 + plugins/prettify/prettify.js | 1740 ++++++ plugins/prettify/prettify.min.js | 1 + plugins/prettify/run_prettify.js | 1995 +++++++ plugins/prettify/themes/atelier-dune-dark.css | 119 + .../prettify/themes/atelier-forest-dark.css | 119 + .../prettify/themes/atelier-savanna-dark.css | 119 + plugins/prettify/themes/tomorrow-light.css | 2 + .../themes/tomorrow-night-eighties.css | 119 + processinclass_625781186.html | 291 ++ pyqt5_hook_key_625781186.html | 312 ++ pyqt5asyncio.html | 484 ++ pyqt_get_subprocess_pipeline_625781186.html | 314 ++ pyqtclient.html | 282 + pyqtclientmac.html | 316 ++ pytest_qt_modal_625781186.html | 303 ++ python_statemachine_625781186.html | 289 + qtninepatch.html | 310 ++ qtwebjs.html | 368 ++ read_open_source.html | 312 ++ rlatticeeffect.html | 521 ++ rss.xml | 1303 +++++ runnablesignal_625781186.html | 283 + search.html | 19 + search.xml | 1134 ++++ search/cb-search.json | 1 + self/btf.css | 1 + self/btf.js | 1 + shadowradius.html | 356 ++ showframe.html | 380 ++ sitemap.xml | 806 +++ speedgithub.html | 290 + static/api/css/imgshare.css | 2 + static/api/css/like.css | 1 + static/api/css/select_share.css | 1 + static/api/css/share_popup.css | 1 + static/api/css/share_style0_16.css | 1 + static/api/css/share_style0_24.css | 1 + static/api/css/share_style0_32.css | 1 + static/api/css/share_style1_16.css | 1 + static/api/css/share_style1_24.css | 1 + static/api/css/share_style1_32.css | 1 + static/api/css/share_style2.css | 1 + static/api/css/share_style2_16.css | 1 + static/api/css/share_style2_24.css | 1 + static/api/css/share_style2_32.css | 1 + static/api/css/share_style4.css | 1 + static/api/css/slide_share.css | 1 + static/api/css/weixin_popup.css | 1 + static/api/img/share/icons_0_16.png | Bin 0 -> 15587 bytes static/api/img/share/icons_0_24.png | Bin 0 -> 28548 bytes static/api/img/share/icons_0_32.png | Bin 0 -> 27169 bytes static/api/img/share/icons_1_16.png | Bin 0 -> 12846 bytes static/api/img/share/icons_1_24.png | Bin 0 -> 19302 bytes static/api/img/share/icons_1_32.png | Bin 0 -> 25605 bytes static/api/img/share/icons_2_16.png | Bin 0 -> 12005 bytes static/api/img/share/icons_2_24.png | Bin 0 -> 17891 bytes static/api/img/share/icons_2_32.png | Bin 0 -> 23519 bytes static/api/img/share/l0.gif | Bin 0 -> 1061 bytes static/api/img/share/l1.gif | Bin 0 -> 979 bytes static/api/img/share/l2.gif | Bin 0 -> 979 bytes static/api/img/share/l3.gif | Bin 0 -> 942 bytes static/api/img/share/l4.gif | Bin 0 -> 972 bytes static/api/img/share/l5.gif | Bin 0 -> 919 bytes static/api/img/share/l6.gif | Bin 0 -> 971 bytes static/api/img/share/l7.gif | Bin 0 -> 964 bytes static/api/img/share/l8.gif | Bin 0 -> 972 bytes static/api/img/share/pop_c.gif | Bin 0 -> 465 bytes static/api/img/share/r0.gif | Bin 0 -> 977 bytes static/api/img/share/r1.gif | Bin 0 -> 980 bytes static/api/img/share/r2.gif | Bin 0 -> 969 bytes static/api/img/share/r3.gif | Bin 0 -> 942 bytes static/api/img/share/r4.gif | Bin 0 -> 974 bytes static/api/img/share/r5.gif | Bin 0 -> 904 bytes static/api/img/share/r6.gif | Bin 0 -> 974 bytes static/api/img/share/r7.gif | Bin 0 -> 965 bytes static/api/img/share/r8.gif | Bin 0 -> 974 bytes static/api/img/share/sc.png | Bin 0 -> 579 bytes static/api/img/share/selectshare_close.png | Bin 0 -> 1056 bytes static/api/img/share/share-search-icon.png | Bin 0 -> 3024 bytes static/api/js/base/class.js | 1 + static/api/js/base/tangram.js | 4 + static/api/js/component/animate.js | 1 + static/api/js/component/anticheat.js | 1 + static/api/js/component/comm_tools.js | 1 + static/api/js/component/partners.js | 1 + static/api/js/component/pop_base.js | 1 + static/api/js/component/pop_dialog.js | 1 + static/api/js/component/pop_popup.js | 1 + static/api/js/component/pop_popup_slide.js | 1 + static/api/js/component/qrcode.js | 1 + static/api/js/conf/const.js | 1 + static/api/js/conf/define.js | 1 + static/api/js/share.js | 1 + static/api/js/share/api_base.js | 1 + static/api/js/share/combine_api.js | 1 + static/api/js/share/image_api.js | 1 + static/api/js/share/like_api.js | 1 + static/api/js/share/likeshare.js | 1 + static/api/js/share/select_api.js | 1 + static/api/js/share/share_api.js | 1 + static/api/js/share/slide_api.js | 1 + static/api/js/start/router.js | 1 + static/api/js/trans/data.js | 0 static/api/js/trans/logger.js | 0 static/api/js/trans/trans.js | 1 + static/api/js/trans/trans_bdxc.js | 1 + static/api/js/trans/trans_bdysc.js | 1 + static/api/js/trans/trans_weixin.js | 1 + static/api/js/view/image_view.js | 1 + static/api/js/view/like_view.js | 1 + static/api/js/view/select_view.js | 1 + static/api/js/view/share_view.js | 1 + static/api/js/view/slide_view.js | 1 + static/api/js/view/view_base.js | 1 + studynotes.html | 373 ++ suggesteditor.html | 329 ++ tag/.9png/feed.json | 21 + tag/.9png/rss.xml | 105 + tag/asyncio/feed.json | 20 + tag/asyncio/rss.xml | 279 + tag/debug/feed.json | 20 + tag/debug/rss.xml | 107 + tag/designer/feed.json | 20 + tag/designer/rss.xml | 84 + tag/ffmpeg/feed.json | 20 + tag/ffmpeg/rss.xml | 134 + tag/github/feed.json | 18 + tag/github/rss.xml | 85 + tag/hls/feed.json | 20 + tag/hls/rss.xml | 134 + tag/m1/feed.json | 20 + tag/m1/rss.xml | 86 + tag/mac/feed.json | 20 + tag/mac/rss.xml | 86 + tag/model/feed.json | 19 + tag/model/rss.xml | 173 + tag/pyqt hook key/feed.json | 19 + tag/pyqt hook key/rss.xml | 107 + tag/pyqt/feed.json | 237 + tag/pyqt/rss.xml | 1693 ++++++ tag/pyqt5 pyside2/feed.json | 18 + tag/pyqt5 pyside2/rss.xml | 77 + tag/pytest-qt/feed.json | 18 + tag/pytest-qt/rss.xml | 98 + .../feed.json" | 19 + .../rss.xml" | 84 + tag/python/feed.json | 121 + tag/python/rss.xml | 593 +++ tag/qwebengineview/feed.json | 21 + tag/qwebengineview/rss.xml | 163 + tag/qwebview/feed.json | 33 + tag/qwebview/rss.xml | 190 + tag/snoop/feed.json | 20 + tag/snoop/rss.xml | 107 + tag/subprocess.popen/feed.json | 20 + tag/subprocess.popen/rss.xml | 109 + tag/virtualenv/feed.json | 20 + tag/virtualenv/rss.xml | 115 + tag/virtualenvwrapper/feed.json | 20 + tag/virtualenvwrapper/rss.xml | 115 + "tag/\344\277\241\345\217\267/feed.json" | 42 + "tag/\344\277\241\345\217\267/rss.xml" | 214 + "tag/\345\212\250\347\224\273/feed.json" | 67 + "tag/\345\212\250\347\224\273/rss.xml" | 765 +++ "tag/\345\233\276\347\211\207/feed.json" | 33 + "tag/\345\233\276\347\211\207/rss.xml" | 277 + "tag/\345\234\206\345\275\242/feed.json" | 20 + "tag/\345\234\206\345\275\242/rss.xml" | 229 + "tag/\345\234\206\350\247\222/feed.json" | 21 + "tag/\345\234\206\350\247\222/rss.xml" | 151 + "tag/\345\274\202\345\270\270/feed.json" | 19 + "tag/\345\274\202\345\270\270/rss.xml" | 93 + "tag/\345\274\202\346\255\245/feed.json" | 20 + "tag/\345\274\202\346\255\245/rss.xml" | 279 + "tag/\346\210\252\345\233\276/feed.json" | 19 + "tag/\346\210\252\345\233\276/rss.xml" | 167 + "tag/\346\213\246\346\210\252print/feed.json" | 20 + "tag/\346\213\246\346\210\252print/rss.xml" | 109 + .../feed.json" | 21 + .../rss.xml" | 151 + "tag/\346\260\224\346\263\241/feed.json" | 21 + "tag/\346\260\224\346\263\241/rss.xml" | 105 + .../feed.json" | 33 + .../rss.xml" | 190 + .../feed.json" | 19 + .../rss.xml" | 166 + "tag/\347\211\271\346\225\210/feed.json" | 31 + "tag/\347\211\271\346\225\210/rss.xml" | 417 ++ "tag/\347\252\227\345\217\243/feed.json" | 19 + "tag/\347\252\227\345\217\243/rss.xml" | 145 + "tag/\347\272\277\347\250\213/feed.json" | 31 + "tag/\347\272\277\347\250\213/rss.xml" | 129 + .../feed.json" | 18 + .../rss.xml" | 124 + "tag/\347\277\273\350\275\254/feed.json" | 20 + "tag/\347\277\273\350\275\254/rss.xml" | 136 + "tag/\350\217\234\345\215\225/feed.json" | 19 + "tag/\350\217\234\345\215\225/rss.xml" | 167 + .../feed.json" | 20 + .../rss.xml" | 84 + "tag/\350\275\256\346\222\255/feed.json" | 20 + "tag/\350\275\256\346\222\255/rss.xml" | 110 + "tag/\350\276\271\346\241\206/feed.json" | 19 + "tag/\350\276\271\346\241\206/rss.xml" | 175 + "tag/\350\277\233\347\250\213/feed.json" | 18 + "tag/\350\277\233\347\250\213/rss.xml" | 86 + "tag/\351\230\264\345\275\261/feed.json" | 33 + "tag/\351\230\264\345\275\261/rss.xml" | 295 ++ tags/9png/index.html | 288 + tags/Asyncio/index.html | 307 ++ tags/Designer/index.html | 290 + tags/FFmpeg/index.html | 302 ++ tags/Github/index.html | 296 ++ tags/HLS/index.html | 302 ++ tags/M1/index.html | 292 ++ tags/Mac/index.html | 292 ++ tags/Model/index.html | 296 ++ tags/PyQt/index.html | 430 ++ tags/PyQt/page/2/index.html | 414 ++ tags/PyQt/page/3/index.html | 414 ++ tags/PyQt5-PySide2/index.html | 288 + tags/Python/index.html | 462 ++ tags/QWebEngineView/index.html | 286 + tags/QWebView/index.html | 299 ++ tags/debug/index.html | 297 ++ tags/index.html | 278 + tags/pyqt-hook-key/index.html | 295 ++ tags/pytest-qt/index.html | 309 ++ .../index.html" | 289 + tags/snoop/index.html | 297 ++ tags/subprocess-Popen/index.html | 296 ++ tags/virtualenv/index.html | 293 ++ tags/virtualenvwrapper/index.html | 293 ++ "tags/\344\277\241\345\217\267/index.html" | 312 ++ "tags/\345\212\250\347\224\273/index.html" | 366 ++ "tags/\345\233\276\347\211\207/index.html" | 308 ++ "tags/\345\234\206\345\275\242/index.html" | 296 ++ "tags/\345\234\206\350\247\222/index.html" | 298 ++ "tags/\345\274\202\345\270\270/index.html" | 294 ++ "tags/\345\274\202\346\255\245/index.html" | 307 ++ "tags/\346\210\252\345\233\276/index.html" | 301 ++ .../\346\213\246\346\210\252print/index.html" | 296 ++ .../index.html" | 298 ++ "tags/\346\260\224\346\263\241/index.html" | 288 + .../index.html" | 299 ++ .../index.html" | 284 + "tags/\347\211\271\346\225\210/index.html" | 319 ++ "tags/\347\252\227\345\217\243/index.html" | 301 ++ "tags/\347\272\277\347\250\213/index.html" | 300 ++ .../index.html" | 289 + "tags/\347\277\273\350\275\254/index.html" | 292 ++ "tags/\350\217\234\345\215\225/index.html" | 297 ++ .../index.html" | 290 + "tags/\350\275\256\346\222\255/index.html" | 285 + "tags/\350\276\271\346\241\206/index.html" | 291 ++ "tags/\350\277\233\347\250\213/index.html" | 287 + "tags/\351\230\264\345\275\261/index.html" | 314 ++ tencent18139824940595684397.txt | 1 + use_pyuic_insteadof_pyside2uic.html | 282 + viewapi.html | 318 ++ viewpyindesigner_625781186.html | 289 + virtualenvpy_625781186.html | 320 ++ webviewnew.html | 289 + 500 files changed, 77298 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 QPropertyAnimation.html create mode 100644 about/index.html create mode 100644 ads.txt create mode 100644 animateshadow.html create mode 100644 archives/2018/09/index.html create mode 100644 archives/2018/10/index.html create mode 100644 archives/2018/11/index.html create mode 100644 archives/2018/index.html create mode 100644 archives/2018/page/2/index.html create mode 100644 archives/2019/01/index.html create mode 100644 archives/2019/02/index.html create mode 100644 archives/2019/03/index.html create mode 100644 archives/2019/04/index.html create mode 100644 archives/2019/05/index.html create mode 100644 archives/2019/07/index.html create mode 100644 archives/2019/08/index.html create mode 100644 archives/2019/12/index.html create mode 100644 archives/2019/index.html create mode 100644 archives/2019/page/2/index.html create mode 100644 archives/2019/page/3/index.html create mode 100644 archives/2023/10/index.html create mode 100644 archives/2023/index.html create mode 100644 archives/2024/04/index.html create mode 100644 archives/2024/index.html create mode 100644 archives/index.html create mode 100644 archives/page/2/index.html create mode 100644 archives/page/3/index.html create mode 100644 archives/page/4/index.html create mode 100644 archives/page/5/index.html create mode 100644 atom.xml create mode 100644 baidusitemap.xml create mode 100644 bindsignals.html create mode 100644 calljava.html create mode 100644 categories/index.html create mode 100644 "categories/\344\276\213\345\255\220/index.html" create mode 100644 "categories/\344\276\213\345\255\220/page/2/index.html" create mode 100644 "categories/\346\225\231\347\250\213/index.html" create mode 100644 "categories/\347\254\224\350\256\260/index.html" create mode 100644 "categories/\351\232\217\347\254\224/index.html" create mode 100644 "category/\344\276\213\345\255\220/feed.json" create mode 100644 "category/\344\276\213\345\255\220/rss.xml" create mode 100644 "category/\346\225\231\347\250\213/feed.json" create mode 100644 "category/\346\225\231\347\250\213/rss.xml" create mode 100644 "category/\347\254\224\350\256\260/feed.json" create mode 100644 "category/\347\254\224\350\256\260/rss.xml" create mode 100644 "category/\351\232\217\347\254\224/feed.json" create mode 100644 "category/\351\232\217\347\254\224/rss.xml" create mode 100644 cgitb.html create mode 100644 circleimage.html create mode 100644 css/index.css create mode 100644 css/var.css create mode 100644 daemonthread.html create mode 100644 datawidgetmapper_625781186.html create mode 100644 equal_str_width_625781186.html create mode 100644 faq/index.html create mode 100644 favicon.ico create mode 100644 feed.json create mode 100644 ffmpeghls.html create mode 100644 "files/\346\227\240\350\276\271\346\241\206\345\234\206\350\247\222\351\230\264\345\275\261.zip" create mode 100644 "files/\350\260\203\347\224\250java\347\224\237\346\210\220\346\212\245\350\241\250.7z" create mode 100644 flipwidgetanimation.html create mode 100644 followwindow.html create mode 100644 guestbook/index.html create mode 100644 images/1.gif create mode 100644 images/1240_thumb.jpg create mode 100644 images/1_thumb.jpg create mode 100644 images/2.gif create mode 100644 images/5ce793171984f27031_thumb.jpg create mode 100644 images/ClickJumpSlider_thumb.jpg create mode 100644 images/FlipWidgetAnimation_thumb.jpg create mode 100644 images/FollowWindow_thumb.jpg create mode 100644 images/FramelessDialog1_thumb.jpg create mode 100644 images/ImageSlipped_thumb.jpg create mode 100644 images/IsSignalConnected_thumb.jpg create mode 100644 images/JsSignals_thumb.jpg create mode 100644 images/MultiSelect_thumb.jpg create mode 100644 images/NinePatchImage_thumb.jpg create mode 100644 images/PageSwitching_thumb.jpg create mode 100644 images/PyQt_Group.png create mode 100644 images/PyQt_Guild.png create mode 100644 images/QPropertyAnimation.gif create mode 100644 images/QPropertyAnimation_thumb.jpg create mode 100644 images/RlatticeEffect_thumb.jpg create mode 100644 images/ShadowEffect_thumb.jpg create mode 100644 images/ShowFrameWhenDrag_thumb.jpg create mode 100644 images/avatar.png create mode 100644 images/bg-2.jpg create mode 100644 images/calljava.png create mode 100644 images/calljava_thumb.jpg create mode 100644 images/circleimage1.png create mode 100644 images/circleimage1_thumb.jpg create mode 100644 images/circleimage2.png create mode 100644 images/datawidgetmapper.gif create mode 100644 images/datawidgetmapper_thumb.jpg create mode 100644 images/default_thumb.jpg create mode 100644 images/desiger_create_thumb.jpg create mode 100644 images/editor1.png create mode 100644 images/editor1_thumb.jpg create mode 100644 images/editor2.png create mode 100644 images/editor3.png create mode 100644 images/editor4.png create mode 100644 images/editor5.png create mode 100644 images/editor6.png create mode 100644 images/editor_env.png create mode 100644 images/editor_import.png create mode 100644 images/editor_import2.png create mode 100644 images/editor_tab.png create mode 100644 images/editor_tpl.png create mode 100644 images/howtoviewapi1.png create mode 100644 images/howtoviewapi1_thumb.jpg create mode 100644 images/howtoviewapi2.png create mode 100644 images/howtoviewapi3.png create mode 100644 images/howtoviewapi4.png create mode 100644 images/howtoviewapi5.png create mode 100644 images/howtoviewapi6.png create mode 100644 images/howtoviewapi7.png create mode 100644 images/howtoviewapi8.png create mode 100644 images/macpyqtstep1.png create mode 100644 images/macpyqtstep2.png create mode 100644 images/macpyqtstep3.png create mode 100644 images/material-10_thumb.jpg create mode 100644 images/material-1_thumb.jpg create mode 100644 images/material-2_thumb.jpg create mode 100644 images/material-3_thumb.jpg create mode 100644 images/material-4_thumb.jpg create mode 100644 images/material-5_thumb.jpg create mode 100644 images/material-6_thumb.jpg create mode 100644 images/material-7_thumb.jpg create mode 100644 images/material-8_thumb.jpg create mode 100644 images/material-9_thumb.jpg create mode 100644 images/processinclass1.png create mode 100644 images/processinclass1_thumb.jpg create mode 100644 images/processinclass2.png create mode 100644 images/pyqt5asyncio.gif create mode 100644 images/pyqt5asyncio_thumb.jpg create mode 100644 images/runnablesignal1.png create mode 100644 images/runnablesignal1_thumb.jpg create mode 100644 images/runnablesignal2.png create mode 100644 images/runnablesignal3.png create mode 100644 images/studynotes/desiger_create.png create mode 100644 images/studynotes/desiger_drag.png create mode 100644 images/studynotes/desiger_layout.png create mode 100644 images/studynotes/desiger_property.png create mode 100644 images/studynotes/desiger_property2.png create mode 100644 images/studynotes/desiger_signal.png create mode 100644 images/studynotes/desiger_signal2.png create mode 100644 images/studynotes/desiger_stack.png create mode 100644 images/viewpyindesigner1.jpg create mode 100644 images/viewpyindesigner1_thumb.jpg create mode 100644 images/viewpyindesigner2.jpg create mode 100644 images/viewpyindesigner3.jpg create mode 100644 images/weixin.png create mode 100644 images/wxblog.jpg create mode 100644 images/zhifubao.png create mode 100644 img/404.jpg create mode 100644 img/favicon.png create mode 100644 img/friend_404.gif create mode 100644 index.html create mode 100644 issignalconnected.html create mode 100644 issues/index.html create mode 100644 js/main.js create mode 100644 js/search/algolia.js create mode 100644 js/search/local-search.js create mode 100644 js/tw_cn.js create mode 100644 js/utils.js create mode 100644 jumpslider.html create mode 100644 likehtmleffect.html create mode 100644 link/index.html create mode 100644 macm1pyqt.html create mode 100644 mselectmenu.html create mode 100644 page/2/index.html create mode 100644 page/3/index.html create mode 100644 page/4/index.html create mode 100644 page/5/index.html create mode 100644 pageswitching.html create mode 100644 plugins/css/history.css create mode 100644 plugins/css/netease.css create mode 100644 plugins/css/special.css create mode 100644 plugins/font/style3.css create mode 100644 plugins/heart/images/web_heart_animation.png create mode 100644 plugins/heart/style.css create mode 100644 plugins/hint/hint.min.css create mode 100644 plugins/images/bottom.png create mode 100644 plugins/images/clock.png create mode 100644 plugins/images/date.png create mode 100644 plugins/images/footprint.png create mode 100644 plugins/images/icons.png create mode 100644 plugins/images/icons2.png create mode 100644 plugins/images/icons3.png create mode 100644 plugins/images/point.png create mode 100644 plugins/images/top.png create mode 100644 plugins/images/vertical.png create mode 100644 plugins/js/easying.js create mode 100644 plugins/js/gotop.js create mode 100644 plugins/js/history.js create mode 100644 plugins/js/jquery.bumpytext.packed.js create mode 100644 plugins/js/jquery.easing.js create mode 100644 plugins/js/jquery.js create mode 100644 plugins/js/jquery.lazyload.min.js create mode 100644 plugins/js/jquery.mousewheel.js create mode 100644 plugins/js/scrollHighlight.js create mode 100644 plugins/prettify/lang-apollo.js create mode 100644 plugins/prettify/lang-basic.js create mode 100644 plugins/prettify/lang-clj.js create mode 100644 plugins/prettify/lang-css.js create mode 100644 plugins/prettify/lang-dart.js create mode 100644 plugins/prettify/lang-erlang.js create mode 100644 plugins/prettify/lang-go.js create mode 100644 plugins/prettify/lang-hs.js create mode 100644 plugins/prettify/lang-lasso.js create mode 100644 plugins/prettify/lang-lisp.js create mode 100644 plugins/prettify/lang-llvm.js create mode 100644 plugins/prettify/lang-logtalk.js create mode 100644 plugins/prettify/lang-lua.js create mode 100644 plugins/prettify/lang-matlab.js create mode 100644 plugins/prettify/lang-ml.js create mode 100644 plugins/prettify/lang-mumps.js create mode 100644 plugins/prettify/lang-n.js create mode 100644 plugins/prettify/lang-pascal.js create mode 100644 plugins/prettify/lang-proto.js create mode 100644 plugins/prettify/lang-r.js create mode 100644 plugins/prettify/lang-rd.js create mode 100644 plugins/prettify/lang-rust.js create mode 100644 plugins/prettify/lang-scala.js create mode 100644 plugins/prettify/lang-sql.js create mode 100644 plugins/prettify/lang-swift.js create mode 100644 plugins/prettify/lang-tcl.js create mode 100644 plugins/prettify/lang-tex.js create mode 100644 plugins/prettify/lang-vb.js create mode 100644 plugins/prettify/lang-vhdl.js create mode 100644 plugins/prettify/lang-wiki.js create mode 100644 plugins/prettify/lang-xq.js create mode 100644 plugins/prettify/lang-yaml.js create mode 100644 plugins/prettify/prettify-default.css create mode 100644 plugins/prettify/prettify.js create mode 100644 plugins/prettify/prettify.min.js create mode 100644 plugins/prettify/run_prettify.js create mode 100644 plugins/prettify/themes/atelier-dune-dark.css create mode 100644 plugins/prettify/themes/atelier-forest-dark.css create mode 100644 plugins/prettify/themes/atelier-savanna-dark.css create mode 100644 plugins/prettify/themes/tomorrow-light.css create mode 100644 plugins/prettify/themes/tomorrow-night-eighties.css create mode 100644 processinclass_625781186.html create mode 100644 pyqt5_hook_key_625781186.html create mode 100644 pyqt5asyncio.html create mode 100644 pyqt_get_subprocess_pipeline_625781186.html create mode 100644 pyqtclient.html create mode 100644 pyqtclientmac.html create mode 100644 pytest_qt_modal_625781186.html create mode 100644 python_statemachine_625781186.html create mode 100644 qtninepatch.html create mode 100644 qtwebjs.html create mode 100644 read_open_source.html create mode 100644 rlatticeeffect.html create mode 100644 rss.xml create mode 100644 runnablesignal_625781186.html create mode 100644 search.html create mode 100644 search.xml create mode 100644 search/cb-search.json create mode 100644 self/btf.css create mode 100644 self/btf.js create mode 100644 shadowradius.html create mode 100644 showframe.html create mode 100644 sitemap.xml create mode 100644 speedgithub.html create mode 100644 static/api/css/imgshare.css create mode 100644 static/api/css/like.css create mode 100644 static/api/css/select_share.css create mode 100644 static/api/css/share_popup.css create mode 100644 static/api/css/share_style0_16.css create mode 100644 static/api/css/share_style0_24.css create mode 100644 static/api/css/share_style0_32.css create mode 100644 static/api/css/share_style1_16.css create mode 100644 static/api/css/share_style1_24.css create mode 100644 static/api/css/share_style1_32.css create mode 100644 static/api/css/share_style2.css create mode 100644 static/api/css/share_style2_16.css create mode 100644 static/api/css/share_style2_24.css create mode 100644 static/api/css/share_style2_32.css create mode 100644 static/api/css/share_style4.css create mode 100644 static/api/css/slide_share.css create mode 100644 static/api/css/weixin_popup.css create mode 100644 static/api/img/share/icons_0_16.png create mode 100644 static/api/img/share/icons_0_24.png create mode 100644 static/api/img/share/icons_0_32.png create mode 100644 static/api/img/share/icons_1_16.png create mode 100644 static/api/img/share/icons_1_24.png create mode 100644 static/api/img/share/icons_1_32.png create mode 100644 static/api/img/share/icons_2_16.png create mode 100644 static/api/img/share/icons_2_24.png create mode 100644 static/api/img/share/icons_2_32.png create mode 100644 static/api/img/share/l0.gif create mode 100644 static/api/img/share/l1.gif create mode 100644 static/api/img/share/l2.gif create mode 100644 static/api/img/share/l3.gif create mode 100644 static/api/img/share/l4.gif create mode 100644 static/api/img/share/l5.gif create mode 100644 static/api/img/share/l6.gif create mode 100644 static/api/img/share/l7.gif create mode 100644 static/api/img/share/l8.gif create mode 100644 static/api/img/share/pop_c.gif create mode 100644 static/api/img/share/r0.gif create mode 100644 static/api/img/share/r1.gif create mode 100644 static/api/img/share/r2.gif create mode 100644 static/api/img/share/r3.gif create mode 100644 static/api/img/share/r4.gif create mode 100644 static/api/img/share/r5.gif create mode 100644 static/api/img/share/r6.gif create mode 100644 static/api/img/share/r7.gif create mode 100644 static/api/img/share/r8.gif create mode 100644 static/api/img/share/sc.png create mode 100644 static/api/img/share/selectshare_close.png create mode 100644 static/api/img/share/share-search-icon.png create mode 100644 static/api/js/base/class.js create mode 100644 static/api/js/base/tangram.js create mode 100644 static/api/js/component/animate.js create mode 100644 static/api/js/component/anticheat.js create mode 100644 static/api/js/component/comm_tools.js create mode 100644 static/api/js/component/partners.js create mode 100644 static/api/js/component/pop_base.js create mode 100644 static/api/js/component/pop_dialog.js create mode 100644 static/api/js/component/pop_popup.js create mode 100644 static/api/js/component/pop_popup_slide.js create mode 100644 static/api/js/component/qrcode.js create mode 100644 static/api/js/conf/const.js create mode 100644 static/api/js/conf/define.js create mode 100644 static/api/js/share.js create mode 100644 static/api/js/share/api_base.js create mode 100644 static/api/js/share/combine_api.js create mode 100644 static/api/js/share/image_api.js create mode 100644 static/api/js/share/like_api.js create mode 100644 static/api/js/share/likeshare.js create mode 100644 static/api/js/share/select_api.js create mode 100644 static/api/js/share/share_api.js create mode 100644 static/api/js/share/slide_api.js create mode 100644 static/api/js/start/router.js create mode 100644 static/api/js/trans/data.js create mode 100644 static/api/js/trans/logger.js create mode 100644 static/api/js/trans/trans.js create mode 100644 static/api/js/trans/trans_bdxc.js create mode 100644 static/api/js/trans/trans_bdysc.js create mode 100644 static/api/js/trans/trans_weixin.js create mode 100644 static/api/js/view/image_view.js create mode 100644 static/api/js/view/like_view.js create mode 100644 static/api/js/view/select_view.js create mode 100644 static/api/js/view/share_view.js create mode 100644 static/api/js/view/slide_view.js create mode 100644 static/api/js/view/view_base.js create mode 100644 studynotes.html create mode 100644 suggesteditor.html create mode 100644 tag/.9png/feed.json create mode 100644 tag/.9png/rss.xml create mode 100644 tag/asyncio/feed.json create mode 100644 tag/asyncio/rss.xml create mode 100644 tag/debug/feed.json create mode 100644 tag/debug/rss.xml create mode 100644 tag/designer/feed.json create mode 100644 tag/designer/rss.xml create mode 100644 tag/ffmpeg/feed.json create mode 100644 tag/ffmpeg/rss.xml create mode 100644 tag/github/feed.json create mode 100644 tag/github/rss.xml create mode 100644 tag/hls/feed.json create mode 100644 tag/hls/rss.xml create mode 100644 tag/m1/feed.json create mode 100644 tag/m1/rss.xml create mode 100644 tag/mac/feed.json create mode 100644 tag/mac/rss.xml create mode 100644 tag/model/feed.json create mode 100644 tag/model/rss.xml create mode 100644 tag/pyqt hook key/feed.json create mode 100644 tag/pyqt hook key/rss.xml create mode 100644 tag/pyqt/feed.json create mode 100644 tag/pyqt/rss.xml create mode 100644 tag/pyqt5 pyside2/feed.json create mode 100644 tag/pyqt5 pyside2/rss.xml create mode 100644 tag/pytest-qt/feed.json create mode 100644 tag/pytest-qt/rss.xml create mode 100644 "tag/python \347\212\266\346\200\201\346\234\272/feed.json" create mode 100644 "tag/python \347\212\266\346\200\201\346\234\272/rss.xml" create mode 100644 tag/python/feed.json create mode 100644 tag/python/rss.xml create mode 100644 tag/qwebengineview/feed.json create mode 100644 tag/qwebengineview/rss.xml create mode 100644 tag/qwebview/feed.json create mode 100644 tag/qwebview/rss.xml create mode 100644 tag/snoop/feed.json create mode 100644 tag/snoop/rss.xml create mode 100644 tag/subprocess.popen/feed.json create mode 100644 tag/subprocess.popen/rss.xml create mode 100644 tag/virtualenv/feed.json create mode 100644 tag/virtualenv/rss.xml create mode 100644 tag/virtualenvwrapper/feed.json create mode 100644 tag/virtualenvwrapper/rss.xml create mode 100644 "tag/\344\277\241\345\217\267/feed.json" create mode 100644 "tag/\344\277\241\345\217\267/rss.xml" create mode 100644 "tag/\345\212\250\347\224\273/feed.json" create mode 100644 "tag/\345\212\250\347\224\273/rss.xml" create mode 100644 "tag/\345\233\276\347\211\207/feed.json" create mode 100644 "tag/\345\233\276\347\211\207/rss.xml" create mode 100644 "tag/\345\234\206\345\275\242/feed.json" create mode 100644 "tag/\345\234\206\345\275\242/rss.xml" create mode 100644 "tag/\345\234\206\350\247\222/feed.json" create mode 100644 "tag/\345\234\206\350\247\222/rss.xml" create mode 100644 "tag/\345\274\202\345\270\270/feed.json" create mode 100644 "tag/\345\274\202\345\270\270/rss.xml" create mode 100644 "tag/\345\274\202\346\255\245/feed.json" create mode 100644 "tag/\345\274\202\346\255\245/rss.xml" create mode 100644 "tag/\346\210\252\345\233\276/feed.json" create mode 100644 "tag/\346\210\252\345\233\276/rss.xml" create mode 100644 "tag/\346\213\246\346\210\252print/feed.json" create mode 100644 "tag/\346\213\246\346\210\252print/rss.xml" create mode 100644 "tag/\346\227\240\350\276\271\346\241\206/feed.json" create mode 100644 "tag/\346\227\240\350\276\271\346\241\206/rss.xml" create mode 100644 "tag/\346\260\224\346\263\241/feed.json" create mode 100644 "tag/\346\260\224\346\263\241/rss.xml" create mode 100644 "tag/\346\265\217\350\247\210\345\231\250/feed.json" create mode 100644 "tag/\346\265\217\350\247\210\345\231\250/rss.xml" create mode 100644 "tag/\346\273\221\345\212\250\346\235\241/feed.json" create mode 100644 "tag/\346\273\221\345\212\250\346\235\241/rss.xml" create mode 100644 "tag/\347\211\271\346\225\210/feed.json" create mode 100644 "tag/\347\211\271\346\225\210/rss.xml" create mode 100644 "tag/\347\252\227\345\217\243/feed.json" create mode 100644 "tag/\347\252\227\345\217\243/rss.xml" create mode 100644 "tag/\347\272\277\347\250\213/feed.json" create mode 100644 "tag/\347\272\277\347\250\213/rss.xml" create mode 100644 "tag/\347\274\226\350\276\221\345\231\250/feed.json" create mode 100644 "tag/\347\274\226\350\276\221\345\231\250/rss.xml" create mode 100644 "tag/\347\277\273\350\275\254/feed.json" create mode 100644 "tag/\347\277\273\350\275\254/rss.xml" create mode 100644 "tag/\350\217\234\345\215\225/feed.json" create mode 100644 "tag/\350\217\234\345\215\225/rss.xml" create mode 100644 "tag/\350\256\276\350\256\241\345\270\210/feed.json" create mode 100644 "tag/\350\256\276\350\256\241\345\270\210/rss.xml" create mode 100644 "tag/\350\275\256\346\222\255/feed.json" create mode 100644 "tag/\350\275\256\346\222\255/rss.xml" create mode 100644 "tag/\350\276\271\346\241\206/feed.json" create mode 100644 "tag/\350\276\271\346\241\206/rss.xml" create mode 100644 "tag/\350\277\233\347\250\213/feed.json" create mode 100644 "tag/\350\277\233\347\250\213/rss.xml" create mode 100644 "tag/\351\230\264\345\275\261/feed.json" create mode 100644 "tag/\351\230\264\345\275\261/rss.xml" create mode 100644 tags/9png/index.html create mode 100644 tags/Asyncio/index.html create mode 100644 tags/Designer/index.html create mode 100644 tags/FFmpeg/index.html create mode 100644 tags/Github/index.html create mode 100644 tags/HLS/index.html create mode 100644 tags/M1/index.html create mode 100644 tags/Mac/index.html create mode 100644 tags/Model/index.html create mode 100644 tags/PyQt/index.html create mode 100644 tags/PyQt/page/2/index.html create mode 100644 tags/PyQt/page/3/index.html create mode 100644 tags/PyQt5-PySide2/index.html create mode 100644 tags/Python/index.html create mode 100644 tags/QWebEngineView/index.html create mode 100644 tags/QWebView/index.html create mode 100644 tags/debug/index.html create mode 100644 tags/index.html create mode 100644 tags/pyqt-hook-key/index.html create mode 100644 tags/pytest-qt/index.html create mode 100644 "tags/python-\347\212\266\346\200\201\346\234\272/index.html" create mode 100644 tags/snoop/index.html create mode 100644 tags/subprocess-Popen/index.html create mode 100644 tags/virtualenv/index.html create mode 100644 tags/virtualenvwrapper/index.html create mode 100644 "tags/\344\277\241\345\217\267/index.html" create mode 100644 "tags/\345\212\250\347\224\273/index.html" create mode 100644 "tags/\345\233\276\347\211\207/index.html" create mode 100644 "tags/\345\234\206\345\275\242/index.html" create mode 100644 "tags/\345\234\206\350\247\222/index.html" create mode 100644 "tags/\345\274\202\345\270\270/index.html" create mode 100644 "tags/\345\274\202\346\255\245/index.html" create mode 100644 "tags/\346\210\252\345\233\276/index.html" create mode 100644 "tags/\346\213\246\346\210\252print/index.html" create mode 100644 "tags/\346\227\240\350\276\271\346\241\206/index.html" create mode 100644 "tags/\346\260\224\346\263\241/index.html" create mode 100644 "tags/\346\265\217\350\247\210\345\231\250/index.html" create mode 100644 "tags/\346\273\221\345\212\250\346\235\241/index.html" create mode 100644 "tags/\347\211\271\346\225\210/index.html" create mode 100644 "tags/\347\252\227\345\217\243/index.html" create mode 100644 "tags/\347\272\277\347\250\213/index.html" create mode 100644 "tags/\347\274\226\350\276\221\345\231\250/index.html" create mode 100644 "tags/\347\277\273\350\275\254/index.html" create mode 100644 "tags/\350\217\234\345\215\225/index.html" create mode 100644 "tags/\350\256\276\350\256\241\345\270\210/index.html" create mode 100644 "tags/\350\275\256\346\222\255/index.html" create mode 100644 "tags/\350\276\271\346\241\206/index.html" create mode 100644 "tags/\350\277\233\347\250\213/index.html" create mode 100644 "tags/\351\230\264\345\275\261/index.html" create mode 100644 tencent18139824940595684397.txt create mode 100644 use_pyuic_insteadof_pyside2uic.html create mode 100644 viewapi.html create mode 100644 viewpyindesigner_625781186.html create mode 100644 virtualenvpy_625781186.html create mode 100644 webviewnew.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..64881ecf --- /dev/null +++ b/404.html @@ -0,0 +1,270 @@ +页面没有找到 | PyQt + + + + + + + + + + + + + +
Page not found

404

页面没有找到
\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..99592d2f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +blog.pyqt5.com diff --git a/QPropertyAnimation.html b/QPropertyAnimation.html new file mode 100644 index 00000000..c4348423 --- /dev/null +++ b/QPropertyAnimation.html @@ -0,0 +1,435 @@ +PyQt属性动画(QPropertyAnimation) | PyQt + + + + + + + + + + + + + + +

PyQt属性动画(QPropertyAnimation)

QPropertyAnimation 继承自 QVariantAnimation ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 QObject 的对象中定义的属性做修改,
+简单来说就是基类是 QObject 且定义了属性变量,就可以用 QPropertyAnimation 来做属性动画。同时也可以通过 pyqtProperty 来增加自定义属性。

+ +

首先,通过构造函数 QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None) 创建一个对象,其中

+
    +
  1. 第一个参数是动画作用的对象,也可以通过 setTargetObject 设置
  2. +
  3. 第二个参数是属性名,在 py3 中类型是 bytes,也可以通过 setPropertyName 设置
  4. +
+

# 函数

+

一些常见的设置函数

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
setPropertyName设置属性名
setTargetObject设置动画作用对象
setDuration设置动画持续时间(毫秒)
setStartValue设置开始值
setEndValue设置结束值
setEasingCurve设置动画曲线
setKeyValueAt插入线性值
setLoopCount设置循环次数(-1 为永久)
+

# 示例

+

比如这个例子:

+
    +
  1. 修改控件的 geometry 大小
  2. +
  3. 修改自定义属性
  4. +
  5. 修改进度条的 value 值
  6. +
+

QPropertyAnimation

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2019年5月8日
+@author: Irony
+@site: https://pyqt5.com https://github.com/892768447
+@email: 892768447@qq.com
+@file: 
+@description: 
+"""
+from PyQt5.QtCore import QPropertyAnimation, QRect, pyqtProperty, QEasingCurve
+from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout,\
+    QLabel, QProgressBar, QSpacerItem, QSizePolicy
+
+
+__Author__ = 'Irony'
+__Copyright__ = 'Copyright (c) 2019 Irony'
+__Version__ = 1.0
+
+
+class Window(QWidget):
+
+    def __init__(self, *args, **kwargs):
+        super(Window, self).__init__(*args, **kwargs)
+        self.resize(400, 400)
+        self._value = 0
+        self.button = QPushButton('属性动画测试', self)
+        self.button.clicked.connect(self.doStart)
+        self.button.setGeometry(0, 0, 80, 40)
+
+        self.buttonc = QPushButton('自定义属性 测试', self)
+        self.buttonc.clicked.connect(self.doStartCustom)
+
+        self.label = QLabel('', self)
+
+        self.progressbar = QProgressBar(self)
+        self.progressbar.setRange(0, 99)
+
+        layout = QVBoxLayout(self)
+        layout.addItem(QSpacerItem(
+            20, 60, QSizePolicy.Fixed, QSizePolicy.Fixed))
+        layout.addWidget(self.buttonc)
+        layout.addWidget(self.label)
+        layout.addWidget(self.progressbar)
+
+        # 进度条动画
+        self.progressStart()
+
+    # 此处是自定义属性,并通过动画修改后,设置QLabel的值
+    @pyqtProperty(int)
+    def value(self):
+        return self._value
+
+    @value.setter
+    def value(self, v):
+        self._value = v
+        self.label.setText('当前值:{}'.format(v))
+
+    def doStart(self):
+        # 第一个参数是要执行的对象
+        animation = QPropertyAnimation(self.button, b'geometry', self)
+        animation.setDuration(2000)  # 持续时间
+        # 缓和曲线风格,加了曲线动画会很大程度影响
+        animation.setEasingCurve(QEasingCurve.OutBounce)
+        animation.setStartValue(QRect(0, 0, 40, 40))
+        animation.setEndValue(QRect(250, 250, 80, 80))
+        animation.start(animation.DeleteWhenStopped)
+
+    def doStartCustom(self):
+        # 自定义属性动画
+        # 由于定义的属性是在继承的QWidget, 所以第一个参数是self
+        # 第二个参数就是 value
+        animation = QPropertyAnimation(self, b'value', self)
+        animation.setDuration(2000)  # 持续时间
+        animation.setStartValue(0)
+        animation.setEndValue(100)
+        animation.start(animation.DeleteWhenStopped)
+
+    def progressStart(self):
+        # 进度条动画
+        # 这里 value是QProgressBar自带的属性,具体可以看文档
+        # https://doc.qt.io/qt-5/qprogressbar.html#properties
+        animation = QPropertyAnimation(self.progressbar, b'value', self)
+        animation.setDuration(2000)  # 持续时间
+        animation.setLoopCount(-1)
+        # 这里采用插入线性值,第一个参数的范围是(0-1)
+        # 第二个参数的范围是进度(最小值-最大值)
+        animation.setKeyValueAt(0, self.progressbar.minimum())
+        animation.setKeyValueAt(0.1, 10)
+        animation.setKeyValueAt(0.2, 30)
+        animation.setKeyValueAt(0.5, 60)
+        animation.setKeyValueAt(0.7, 80)
+        animation.setKeyValueAt(1, self.progressbar.maximum())
+        animation.start(animation.DeleteWhenStopped)
+
+
+if __name__ == '__main__':
+    import sys
+    from PyQt5.QtWidgets import QApplication
+    app = QApplication(sys.argv)
+    w = Window()
+    w.show()
+    sys.exit(app.exec_())
+
文章作者: Irony
文章链接: https://pyqt5.com/QPropertyAnimation.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..80788458 --- /dev/null +++ b/about/index.html @@ -0,0 +1,292 @@ +关于社区 | PyQt + + + + + + + + + + + + + +

# 为什么要搭建这个社区

+

也许是因为喜爱 PyQt,喜欢用它做很多东西吧,也想为大家提供更多关于 PyQt 的帮助。

+

内容主要是 记录 一些开发日志,分享些 我认为有趣的东西,还有 各种教程、例子 等等。

+

还有就是收集和整理记录下网友们平时遇到的问题,提出的需求等等,方便其他人搜索。

+

如需帮助可以前往 issues 留下您的问题

+

如需发表文章可以前往 这里 发表新文章,同时需要查看 发文要求

+

# 投稿

+

欢迎投稿: https://github.com/PyQt5/blog/blob/dev/README.md

+

# 关于我?

+

信息很少…

+

# 联系我们?

+

点击链接加入群聊【PyQt5 学习】:https://jq.qq.com/?_wv=1027&k=5Y29SHz

+

# 捐助支持

+

微信 or 支付宝

+
\ No newline at end of file diff --git a/ads.txt b/ads.txt new file mode 100644 index 00000000..238a07ab --- /dev/null +++ b/ads.txt @@ -0,0 +1 @@ +google.com, pub-7185628244213160, DIRECT, f08c47fec0942fa0 \ No newline at end of file diff --git a/animateshadow.html b/animateshadow.html new file mode 100644 index 00000000..09915dc3 --- /dev/null +++ b/animateshadow.html @@ -0,0 +1,406 @@ +PyQt5动画边框阴影 | PyQt + + + + + + + + + + + + + + + +

PyQt5动画边框阴影

为子控件增加动画阴影效果,结合 QGraphicsDropShadowEffectQPropertyAnimation 动态改变阴影半径达到效果,在旧版本的 Qt 中 QGraphicsDropShadowEffect 可能会有点问题(父控件会影响子控件)

+ +

# 原理

+

原理是利用 QGraphicsDropShadowEffect 添加边框阴影,然后使用动画不停改变阴影的模糊半径来达到效果,如图:

+

ShadowEffect

+

# 简单说明

+
    +
  1. 继承 QGraphicsDropShadowEffect 增加动态属性 radius
  2. +
  3. 通过 setGraphicsEffect 方法设置控件的边框阴影
  4. +
  5. 通过 QPropertyAnimation 属性动画不断改变 radius 的值并调用 setBlurRadius 更新半径值
  6. +
+

https://github.com/PyQt5/PyQt/blob/master/QGraphicsDropShadowEffect/ShadowEffect.py

+

# 自定义类

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2018年9月25日
+@author: Irony
+@site: https://pyqt5.com, https://github.com/892768447
+@email: 892768447@qq.com
+@file: AnimationShadowEffect
+@description: 边框动画阴影动画
+"""
+from PyQt5.QtCore import QPropertyAnimation, pyqtProperty
+from PyQt5.QtWidgets import QGraphicsDropShadowEffect
+
+
+__Author__ = """By: Irony
+QQ: 892768447
+Email: 892768447@qq.com"""
+__Copyright__ = 'Copyright (c) 2018 Irony'
+__Version__ = 1.0
+
+
+class AnimationShadowEffect(QGraphicsDropShadowEffect):
+
+    def __init__(self, color, *args, **kwargs):
+        super(AnimationShadowEffect, self).__init__(*args, **kwargs)
+        self.setColor(color)
+        self.setOffset(0, 0)
+        self.setBlurRadius(0)
+        self._radius = 0
+        self.animation = QPropertyAnimation(self)
+        self.animation.setTargetObject(self)
+        self.animation.setDuration(2000)  # 一次循环时间
+        self.animation.setLoopCount(-1)  # 永久循环
+        self.animation.setPropertyName(b'radius')
+        # 插入线行值
+        self.animation.setKeyValueAt(0, 1)
+        self.animation.setKeyValueAt(0.5, 30)
+        self.animation.setKeyValueAt(1, 1)
+
+    def start(self):
+        self.animation.start()
+
+    @pyqtProperty(int)
+    def radius(self):
+        return self._radius
+
+    @radius.setter
+    def radius(self, r):
+        self._radius = r
+        self.setBlurRadius(r)
+

# 测试代码

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2018年9月25日
+@author: Irony
+@site: https://pyqt5.com, https://github.com/892768447
+@email: 892768447@qq.com
+@file: Test
+@description: 
+"""
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QPixmap
+from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QPushButton, QLineEdit
+
+from AnimationShadowEffect import AnimationShadowEffect  # @UnresolvedImport
+
+
+__Author__ = """By: Irony
+QQ: 892768447
+Email: 892768447@qq.com"""
+__Copyright__ = 'Copyright (c) 2018 Irony'
+__Version__ = 1.0
+
+
+class Window(QWidget):
+
+    def __init__(self, *args, **kwargs):
+        super(Window, self).__init__(*args, **kwargs)
+        layout = QHBoxLayout(self)
+
+        # 绿色边框
+        labelGreen = QLabel(self, pixmap=QPixmap('1.jpg').scaled(100, 100))
+        layout.addWidget(labelGreen)
+        aniGreen = AnimationShadowEffect(Qt.darkGreen, labelGreen)
+        labelGreen.setGraphicsEffect(aniGreen)
+        aniGreen.start()
+
+        # 红色边框,圆形图片
+        labelRed = QLabel(self)
+        labelRed.setMinimumSize(100, 100)
+        labelRed.setMaximumSize(100, 100)
+        labelRed.setStyleSheet('border-image: url(1.jpg);border-radius: 50px;')
+        layout.addWidget(labelRed)
+        aniRed = AnimationShadowEffect(Qt.red, labelGreen)
+        labelRed.setGraphicsEffect(aniRed)
+        aniRed.start()
+
+        # 蓝色边框按钮
+        button = QPushButton('按钮', self)
+        aniButton = AnimationShadowEffect(Qt.blue, button)
+        layout.addWidget(button)
+        button.setGraphicsEffect(aniButton)
+        aniButton.start()
+
+        # 青色边框输入框
+        lineedit = QLineEdit(self)
+        aniEdit = AnimationShadowEffect(Qt.cyan, lineedit)
+        layout.addWidget(lineedit)
+        lineedit.setGraphicsEffect(aniEdit)
+        aniEdit.start()
+
+
+if __name__ == '__main__':
+    import sys
+    from PyQt5.QtWidgets import QApplication
+    app = QApplication(sys.argv)
+    w = Window()
+    w.show()
+    sys.exit(app.exec_())
文章作者: Irony
文章链接: https://pyqt5.com/animateshadow.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/archives/2018/09/index.html b/archives/2018/09/index.html new file mode 100644 index 00000000..98ccdc22 --- /dev/null +++ b/archives/2018/09/index.html @@ -0,0 +1,276 @@ +2018年09月 | PyQt + + + + + + + + + + + +
文章总览 - 3
2018
PyQt5动画边框阴影
PyQt5动画边框阴影
PyQt5圆形图片
PyQt5圆形图片
异常捕获之cgitb模块
异常捕获之cgitb模块
\ No newline at end of file diff --git a/archives/2018/10/index.html b/archives/2018/10/index.html new file mode 100644 index 00000000..54c073f0 --- /dev/null +++ b/archives/2018/10/index.html @@ -0,0 +1,276 @@ +2018年10月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2018/11/index.html b/archives/2018/11/index.html new file mode 100644 index 00000000..f6c19aa8 --- /dev/null +++ b/archives/2018/11/index.html @@ -0,0 +1,276 @@ +2018年11月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2018/index.html b/archives/2018/index.html new file mode 100644 index 00000000..c22a3b74 --- /dev/null +++ b/archives/2018/index.html @@ -0,0 +1,276 @@ +2018 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2018/page/2/index.html b/archives/2018/page/2/index.html new file mode 100644 index 00000000..c54927c6 --- /dev/null +++ b/archives/2018/page/2/index.html @@ -0,0 +1,276 @@ +2018 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/01/index.html b/archives/2019/01/index.html new file mode 100644 index 00000000..134b87e8 --- /dev/null +++ b/archives/2019/01/index.html @@ -0,0 +1,276 @@ +2019年01月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/02/index.html b/archives/2019/02/index.html new file mode 100644 index 00000000..85307bfd --- /dev/null +++ b/archives/2019/02/index.html @@ -0,0 +1,276 @@ +2019年02月 | PyQt + + + + + + + + + + + +
文章总览 - 1
2019
PyQtClient例子客户端
PyQtClient例子客户端
\ No newline at end of file diff --git a/archives/2019/03/index.html b/archives/2019/03/index.html new file mode 100644 index 00000000..1ada7f89 --- /dev/null +++ b/archives/2019/03/index.html @@ -0,0 +1,276 @@ +2019年03月 | PyQt + + + + + + + + + + + +
文章总览 - 1
2019
Python调用Java对Excel截图
Python调用Java对Excel截图
\ No newline at end of file diff --git a/archives/2019/04/index.html b/archives/2019/04/index.html new file mode 100644 index 00000000..ac20ffbf --- /dev/null +++ b/archives/2019/04/index.html @@ -0,0 +1,276 @@ +2019年04月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/05/index.html b/archives/2019/05/index.html new file mode 100644 index 00000000..c9601a9e --- /dev/null +++ b/archives/2019/05/index.html @@ -0,0 +1,276 @@ +2019年05月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/07/index.html b/archives/2019/07/index.html new file mode 100644 index 00000000..a2f1f05d --- /dev/null +++ b/archives/2019/07/index.html @@ -0,0 +1,276 @@ +2019年07月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/08/index.html b/archives/2019/08/index.html new file mode 100644 index 00000000..f2e88c9f --- /dev/null +++ b/archives/2019/08/index.html @@ -0,0 +1,276 @@ +2019年08月 | PyQt + + + + + + + + + + + +
文章总览 - 1
2019
PyQt学习心得
PyQt学习心得
\ No newline at end of file diff --git a/archives/2019/12/index.html b/archives/2019/12/index.html new file mode 100644 index 00000000..ba282394 --- /dev/null +++ b/archives/2019/12/index.html @@ -0,0 +1,276 @@ +2019年12月 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/index.html b/archives/2019/index.html new file mode 100644 index 00000000..71bbccea --- /dev/null +++ b/archives/2019/index.html @@ -0,0 +1,276 @@ +2019 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/page/2/index.html b/archives/2019/page/2/index.html new file mode 100644 index 00000000..da4f8de0 --- /dev/null +++ b/archives/2019/page/2/index.html @@ -0,0 +1,276 @@ +2019 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2019/page/3/index.html b/archives/2019/page/3/index.html new file mode 100644 index 00000000..affe00ac --- /dev/null +++ b/archives/2019/page/3/index.html @@ -0,0 +1,276 @@ +2019 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/2023/10/index.html b/archives/2023/10/index.html new file mode 100644 index 00000000..7b22ae42 --- /dev/null +++ b/archives/2023/10/index.html @@ -0,0 +1,276 @@ +2023年10月 | PyQt + + + + + + + + + + + +
文章总览 - 1
2023
如何在Mac M1上快速安装PyQt5
如何在Mac M1上快速安装PyQt5
\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html new file mode 100644 index 00000000..2ec8d2ec --- /dev/null +++ b/archives/2023/index.html @@ -0,0 +1,276 @@ +2023 | PyQt + + + + + + + + + + + +
文章总览 - 1
2023
如何在Mac M1上快速安装PyQt5
如何在Mac M1上快速安装PyQt5
\ No newline at end of file diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html new file mode 100644 index 00000000..09969502 --- /dev/null +++ b/archives/2024/04/index.html @@ -0,0 +1,276 @@ +2024年04月 | PyQt + + + + + + + + + + + +
文章总览 - 1
2024
pytest-qt 测试模态窗体.
pytest-qt 测试模态窗体.
\ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html new file mode 100644 index 00000000..c18b7851 --- /dev/null +++ b/archives/2024/index.html @@ -0,0 +1,276 @@ +2024 | PyQt + + + + + + + + + + + +
文章总览 - 1
2024
pytest-qt 测试模态窗体.
pytest-qt 测试模态窗体.
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 00000000..d2b7193a --- /dev/null +++ b/archives/index.html @@ -0,0 +1,276 @@ +归档 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 00000000..aa94434a --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,276 @@ +归档 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 00000000..98b5dea6 --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,276 @@ +归档 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html new file mode 100644 index 00000000..1c1f09c9 --- /dev/null +++ b/archives/page/4/index.html @@ -0,0 +1,276 @@ +归档 | PyQt + + + + + + + + + + + +
\ No newline at end of file diff --git a/archives/page/5/index.html b/archives/page/5/index.html new file mode 100644 index 00000000..04edac15 --- /dev/null +++ b/archives/page/5/index.html @@ -0,0 +1,276 @@ +归档 | PyQt + + + + + + + + + + + +
文章总览 - 41
2018
异常捕获之cgitb模块
异常捕获之cgitb模块
\ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000..40e631d2 --- /dev/null +++ b/atom.xml @@ -0,0 +1,508 @@ + + + PyQt + + 个人学习经验分享 + + + + 2024-04-30T01:46:52.392Z + https://pyqt5.com/ + + + Irony + + + + Hexo + + + pytest-qt 测试模态窗体. + + https://pyqt5.com/pytest_qt_modal_625781186.html + 2024-04-30T01:46:52.392Z + 2024-04-30T01:46:52.392Z + + 步骤分别是 :

  1. 点击 开始扫描 弹出 选择路径窗口;

  2. 勾选路基;

3. 点击确定;

大概想测一下这个界面 :

image.png

步骤分别是 :

  1. 点击 开始扫描 弹出 选择路径窗口;

  2. 勾选路基;

3. 点击确定;

需要测试的函数 :

image.png

测试函数 :

image.png

可以发现断言失败 .

image.png

官方文档:测试模态窗体.

https://pytest-qt.readthedocs.io/en/latest/note_dialogs.html

用的是官方的 monkeypatch 方式 .

大致意思就是替换 FileSelectPathDialog 类的 exec 函数.

]]>
+ + + <p>步骤分别是 :</p> +<ol> +<li> +<p>点击 开始扫描 弹出 选择路径窗口;</p> +</li> +<li> +<p>勾选路基;</p> +</li> +</ol> +<p>3. 点击确定;</p> + + + + + + + + +
+ + + 如何在Mac M1上快速安装PyQt5 + + https://pyqt5.com/macm1pyqt.html + 2023-10-07T06:08:06.000Z + 2024-04-30T01:46:52.392Z + + 由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。
M1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。

1. 安装 Python
python-3.9.13-macosx10.9.pkg

2. 勾选自定义同时只勾选安装 pip

step1.png

step1.png

3. 设置 pip 源

/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install pqi/Library/Frameworks/Python.framework/Versions/3.9/bin/pqi use tuna

4. 安装 PyQt5

/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install PyQt5

5. 测试

/Library/Frameworks/Python.framework/Versions/3.9/bin/python3

step3.png

📢📢📢

也可以直接安装 Miniconda

然后:conda install -c conda-forge pyqt

]]>
+ + + <p>由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。<br> +M1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。</p> + + + + + + + + + + + + +
+ + + python 判断屏幕等宽字符串的长度   + + https://pyqt5.com/equal_str_width_625781186.html + 2019-12-26T11:49:41.000Z + 2024-04-30T01:46:52.392Z + + 判断屏幕等宽字符串的长度?

判断屏幕等宽字符串的长度?

image.png

【新手】重庆 - 搬砖 - NoWait 22:41:50 @北京 - BUG 开发 - 黑择明 求指点
【专家】北京 - BUG 开发 - 黑择明 22:43:04 fontMetrics
【专家】 https://pyqt.site (892768447) 22:43:54 QFontMetrics
【专家】 https://pyqt.site (892768447) 22:44:09 通过 QLabel.font ().fontMetrics () 得到

【新手】重庆 - 搬砖 - NoWait 22:52:00
https://stackoverflow.com/questions/35771863/how-to-calculate-length-of-string-in-pixels-for-specific-font-and-size
image.png

【新手】重庆 - 搬砖 - NoWait 22:53:15 感觉和 fontMetrics 应该是差不多的

image.png


【专家】北京 - BUG 开发 - 黑择明 (996742224) 11:29:04
fm = QFontMetrics(QFont())
fm.width(“qweqwe”)

]]>
+ + + <p>判断屏幕等宽字符串的长度?</p> + + + + + + + + +
+ + + 修改pyuic代替pyside2-uic. + + https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html + 2019-12-26T11:49:41.000Z + 2024-04-30T01:46:52.396Z + + 修改 pyuic 代替 pyside2-uic

修改 pyuic 代替 pyside2-uic.

最近看到挺多人用 pyside2 的 uic 编译 ui 文件有问题 .
写个解决办法.

首先,
pip install qtpy ,
这个是兼容 pyqt5 和 pyside2 的,无缝转换 .

然后,
修改 pyqt5 的 uic ,

image.png

最后用 pyuic5 , 生成 Ui_XXX.py 文件 .

]]>
+ + + <p>修改 pyuic 代替 pyside2-uic</p> + + + + + + + + +
+ + + PyQt学习心得 + + https://pyqt5.com/studynotes.html + 2019-08-26T01:00:00.000Z + 2024-04-30T01:46:52.392Z + + 在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。

# Python 基础

在学习和使用 PyQt 之前需要熟练使用 Python,经过对 QQ 群里经常提问的问题的分析,发现大部分人对 Python 中的基础知识掌握不牢固导致很多基础问题,如果要想更好的使用 Python 以及它的扩展必需要进行系统的学习。这里列举一下常用的知识点。

  1. 类         参考资料
  2. 类的继承
  3. 类的多继承
  4. 类方法重写     参考资料
  5. 类中的 super 函数  参考资料
  6. 函数调用 / 参数类型
  7. 对象调用 (参考第 1 点)

必须熟练掌握上面的知识点后入门 PyQt 才比较容易,如果初学者对上面的知识点还不是很了解,本文不适合继续往下阅读。

# 设计师

Qt 设计师除了方便快速设计一些简单的界面外,其实笔者觉得更大的作用在于帮助用户熟悉各类控件、属性、信号等

  1. 这里建议初学者不要急于求成,打开设计师新建一个 Widget 的窗口,比如

desiger_create

  1. 然后把左侧的所有控件挨个拖动到中间的窗口中,比如这里拖动一个 Push Button 按钮

desiger_drag

  1. 在设计师右下角的属性编辑器中列举了该控件的所有父类,意味着可以调用和重写父类的所有方法,建议初学者把这个属性编辑器的所有属性挨个调整看看效果,部分控件可能需要 Ctrl+R 预览界面才能看到,同时像 QListWidget,QTreeWidget,QTableWidget 等某些控件需要在控件上右键增加数据才可以

desiger_property
desiger_property2

  1. 两个控件之间简单的信号槽关联可以通过设计师快速的设置

desiger_signal
desiger_signal2

  1. 提高进阶的方法,当你需要手动写代码实现界面的时候,不妨把 UI 文件转出 PY 文件,看看是如何构造的(这里涉及到布局等知识见后文)

# 布局

Qt 界面提供了方便的 4 种基本布局,QVboxLayout,QHboxLayout,QFormLayout,QGridLayout,初学者需要数量掌握这 4 种布局外加 2 种拉伸器(占位挤压)

首先需要知道 Qt 界面的中控件的层级顺序以及 parent,parent 的作用既作为子控件的父元素也可以自动管理 Qt 的对象(具体可以搜索下关于 Qt parent 的资料)

  1. 在没有布局的情况下,在设计师中拖动摆放的控件是一层一层的叠加覆盖,此时每个添加的子控件的 parent 都是最外层的控件

desiger_stack

  1. 如果需要界面中的控件自动适应高度宽度,此时则需要使用 4 种布局来包裹里面的子控件,注意的是:布局不是控件不能设置高度宽度和样式等,是一个抽象的东西,就好比是一根橡皮筋包裹几个矩形的物品;布局也可以设置一些属性(在设计师属性编辑器中),比如设置两者直接的间距,设置距离上下左右的间距,设置比例等

desiger_layout

  1. 在没有布局或者有布局的时候。可以添加容器控件(QWidget,QFrame,QGroupBox,QScrollArea,QToolBox,QTabWidget,QStackedWidget,QMidArea,QDockWidget)这些容器可以放置子控件,从而循环嵌套。

# 例子

在 PyQt5.5 的时候自带了一个例子文件夹(后面的版本没有的话可以下载 PyQt5 源码,里面有个 examples 文件夹),想要熟练的掌握 PyQt 还需要从自带的例子中学习,必须要每个例子都运行一次然后看看这个例子实现了什么,这样才能记忆深刻。
同时很多开发者在 https://github.com/PyQt5/PyQt 分享了各类进阶例子,同时也欢迎大家共同完善该项目,提供更多更好的例子。另外也可以下载该项目的客户端 PyQtClient 软件,支持运行其中的例子

建议在更深入的学习 PyQt 之前多看看一些例子。

# 文档

接下来要说的就是 Qt 的 api 文档,官网文档,这里其实不要害怕是英文就不想看,觉得看不懂了,其实官网的文档还是比较简洁的,而且函数名也比较直观就能知道意思。也可以用谷歌浏览器打开右键翻译,基本上都能看懂。笔者前期写过一篇如何查阅 Qt 文档的文档可以阅读学习一番。

这里就拿 QWebEngineView 举一个例子,首先初学者在使用这个浏览器控件时候,会有诸多的问题比如:Cookie,拦截器等就不知道如何去调用函数来设置

  1. 首先打开官网文档 https://doc.qt.io/qt-5/qwebengineview.html,可以看到只有少量的函数可以调用,寻找一番并没有发现和 Cookie 相关的东西,这个时候就需要把重点放在有特俗返回值的函数上,比如:
QWebEngineHistory *          history() constQWebEnginePage *          page() constQWebEngineSettings *      settings() const

这三个函数返回了一个类实例,就意味着可以调用其中的方法。

  1. 点击 page () 打开 https://doc.qt.io/qt-5/qwebenginepage.html,发现没有 cookie 相关的东西,只有 QWebEngineProfile *profile () const 这个函数比较可疑。

  2. 点击 **profile ()** 打开 https://doc.qt.io/qt-5/qwebengineprofile.html,在浏览器中搜索 cookie 发现这个类中包含大量和 cookie 相关的东西,比如:**QWebEngineCookieStore *cookieStore ()`** 从名字上可以猜测大概意思为 cookie 储存

  3. 点击 **cookieStore ()** 打开 https://doc.qt.io/qt-5/qwebenginecookiestore.html,此时就会发现这个类里面包含了删除和设置 cookie 的方法。

  4. 但是找到了这些方法后,面对初学者又一个问题来了,该如何去用?根据上面 4 点整理一下,把他们当做简单的 Python 对象,方法和操作方法和 class 一样的。

self.webview = QWebEngineView()# 得到pagepage = self.webview.page()# 得到profileprofile = page.profile()# 得到cookieStorecookieStore = profile.cookieStore()# 清空cookiecookieStore.deleteAllCookies()# 用简短代码来表达就是cookieStore = self.webview.page().profile().cookieStore()cookieStore.deleteAllCookies()

# 异常调试

可能有时候由于粗心,或者调用了一些非法函数,参数错误等会导致程序出现一些异常,首先第一步复制最后一行的错误去百度或者谷歌搜索,大多时候能找到问题所在。其次如果搜索不到或者自己的异常可能是由于某个变量的值不对引起的,就需要在编辑器中打断点使用 DEBUG 模式调试变量值(如果不会可以采用麻烦一点的办法:用 print 打印出变量值)

遇到问题后首先需要自己多调试排查问题,不要一遇到问题就去问,自己多尝试一个一个排查直到找到问题所在并解决,这也是一种提高自身能力的地方。

# 检索资料

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。信息检索是每个程序猿必备的能力之一,其好处在于可以更快更准确的在茫茫网络海洋中找到自己所需要的东西,这个过程需要长期不断积累和练习。

  1. 中文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt 拖拽
  2. 英文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt Drag Drop

# 片尾

好了,笔者基本上的学习过程就整理如上,这并不是说每个人都适合这样的方法,但至少笔者是这样一步一步走过来的。当你养成了一个学习、发现和解决问题的好习惯时就会慢慢得心应手。

]]>
+ + + <p>在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。</p> + + + + + + + + +
+ + + python 状态机模块   + + https://pyqt5.com/python_statemachine_625781186.html + 2019-07-17T09:03:33.000Z + 2024-04-30T01:46:52.392Z + + 用状态来取代 if…else 判断。

GUI 涉及到挺多的状态改变,以前一直用 if…else 来判断,最近读了设计模式,发现有个状态模式,随后发现了状态机这个东西 .

python 的状态机模块挺多的,不过好像很多都不更新了.
推荐 2 个状态机模块,但是也没有太深入的使用经验,就跑跑例子,以后有更详细的 pyqt 例子再补上 .

1: pip install python-statemachine

官方例子 : https://github.com/fgmacedo/python-statemachine

2. pip install state_machine

官方例子 : https://github.com/jtushman/state_machine

1 的 最近一次更新在 6 个月以前,使用 类继承mixin 方式,不过有些地方不如 2 个人性化;

2 的设计更人性化一些,包括状态改变 beforeafter , 不过由于是装饰器实现的动态增加属性,有些地方编辑器智能提示可能就靠不上了.

两者实现实现方式不一样,有兴趣可以读读源码 .

  1. qt 内置状态机框架

https://blog.csdn.net/amnes1a/article/details/62418196

https://blog.csdn.net/dongfenghuojian/article/details/78187131

http://blog.sina.com.cn/s/articlelist_3284623693_0_1.html (系列教程)

]]>
+ + + <p>用状态来取代 if…else 判断。</p> + + + + + + + + + + +
+ + + 在pyqt中使用python全局钩子模块 + + https://pyqt5.com/pyqt5_hook_key_625781186.html + 2019-07-06T17:37:22.000Z + 2024-04-30T01:46:52.392Z + + 在某些时候需要为自己的软件增加全局键盘监听,比如软件最小化隐藏后可以通过热键唤醒,又或者比如像 QQ 一样可以全局热键截图。这里介绍几个方法实现在 PyQt 中使用 Python 全局钩子模块实现全局热键功能。

  1. pyHook3

安装命令 : pip install pyhook3

https://blog.csdn.net/q871063970/article/details/86648386

似乎将 pyhook 支持 py3 版本的了?没有太多研究.

缺点:只支持 win 平台.

2. keyboard & mouse

安装命令: pip install keyboard mouse

from PyQt5 import  QtGui, QtWidgets, QtCorefrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *import keyboardclass Window(QWidget):    def __init__(self, *args, **kwargs):        super(Window, self).__init__(*args, **kwargs)        layout = QVBoxLayout(self)        self.testBtn = QPushButton(self)        layout.addWidget(self.testBtn)        keyboard.add_hotkey('ctrl+shift+x', lambda:print('triggered', 'hotkey'))        keyboard.add_hotkey('ctrl+shift+c', self.abc,args=('aa',"bb","cc"))    def abc(self,a,b,c):        print(a,b,c)        if __name__ == '__main__':    import sys    from PyQt5.QtWidgets import QApplication    app = QApplication(sys.argv)    w = Window()    w.show()    sys.exit(app.exec_())

更详细例子 : pyqt 中使用 keyboard 全局热键

优点:跨平台;

缺点:模块名字取得太差,不容易被发现.

]]>
+ + + <p>在某些时候需要为自己的软件增加全局键盘监听,比如软件最小化隐藏后可以通过热键唤醒,又或者比如像 QQ 一样可以全局热键截图。这里介绍几个方法实现在 PyQt 中使用 Python 全局钩子模块实现全局热键功能。</p> + + + + + + + + + + +
+ + + 像读文章一样读源码 + + https://pyqt5.com/read_open_source.html + 2019-07-06T17:37:22.000Z + 2024-04-30T01:46:52.392Z + + 使用 snoop, 像读文章一样读源码。

不得不说 开源项目没有一个提纲 , 看起来太操蛋了。问了作者, 作者说 , 你运行下主函数, 然后慢慢跟 。。。
image.png

没有目的地概览 , 不知不觉就追究到细节里面去了。

image.png

所以这一篇文章的目地就是 , 如何在没有提纲的情况下 , 能更好的只关注流程 , 而不是细节 。

开始 :

  1. python DEBUG 模块介绍 :
     前段时间看过挺多文章提到 pysoonper 这个调试模块,有兴趣的可以百度一下.
    个人尝试了一下,篇幅过大的 DEBUG 不适合用 pysoonper , 因为没有缩进!
     这几天偶然遇到一个二次封装的模块 snoop, 完美地解决了这个问题.
  2. 操作步骤 :
  • 1 . 在 eric6.pymain() 函数上加 snoop 装饰器;
    image.png
  • 2 . 用 vscode 打开 eric6start_.log 文件 (8 层深度 log 文件 34W 行,pycharm 对大文件支持很差);
    log文件

发现可以折叠 , 但是最大可折叠等级只到 5 级 , 而且无法对对应等级折叠 , 有点遗憾 。也许是.log 格式选得不太好, 不知道是否有更好的后缀格式。

  • 3 . vscode 配置 log 文件关键字高亮;
    安装高亮插件
    image.png
    配置高亮关键字
    image.png

callreturn 给加进去.

  • 4 . 增加阶段关键字;

eric6启动阶段

image.png

#000 是为了方便搜索 。
需要自己手动折叠 。
可以发现 每个 splash.showMessage() 都是一个阶段 , 展开折叠之后就是每个阶段具体执行细节 。


# ps: vscode 阅读 log 文件还是有一些不方便的地方,除了在 2. 中提到的,还有包括关闭文件再打开,折叠状态不会保留,有其他更好的方式 请留言告诉我,谢谢.

]]>
+ + + <p>使用 snoop, 像读文章一样读源码。</p> + + + + + + + + + + + + +
+ + + python 获取子进程print信息   + + https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html + 2019-05-24T06:39:44.000Z + 2024-04-30T01:46:52.392Z + + 在 PyQt 中使用子线程读取子进程 Python 脚本的 print 输出流内容。

问题所在:

image.png

如果模块都由自己开发, 正常操作

image.png

但是因为不能改,所以只能拦截:
代码:

pythonPath = self.pythonPath_cb.currentText()if suffix == "py":    # 首次    self.pyCommand = [pythonPath, path]    self.modifiedReloadPython(path)def modifiedReloadPython(self, path_):    os.chdir(os.path.dirname(path_))    # 子进程调用    self.p = subprocess.Popen(self.pyCommand, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)    # self.stdoutWorker.p = self.p    self.stdoutWorker = Worker(self.p)    self.stdoutWorker.stdout_signal.connect(lambda x: self.error_te.append("PYDEBUG:\n" + x))    self.stdoutWorker.start()class Worker(QThread):    stdout_signal = pyqtSignal(str)    def __init__(self, p, parent=None):        super().__init__(parent)        self.p = p    def run(self):        while True:            QApplication.processEvents()            if self.p is not None:                line = self.p.stdout.readline()                # line = line.strip()                if line != b'':                    try:                        info = line.decode()                        self.stdout_signal.emit(info)                    except:                        self.stdout_signal.emit(repr(line))    
]]>
+ + + <p>在 PyQt 中使用子线程读取子进程 Python 脚本的 print 输出流内容。</p> + + + + + + + + + + + + +
+ + + QtWebkit和QWebEngineView与Javascript交互 + + https://pyqt5.com/qtwebjs.html + 2019-05-22T03:30:36.000Z + 2024-04-30T01:46:52.392Z + + 以前还是 QWebView 的时候和 Javascript 交互起来很方便,但是到了 Qt5.6 以后改用了 QWebEngineView ,并通过其提供的 qwebchannel.js 来进行交互。可能是由于刚出来的原因,这玩意儿有个 bug 就是必须在每次加载页面的时候手动注入,跳转页面后就失效了,需要手动注入,目前有没有修复具体未测试。这里对 QWebViewQWebEngineView 与 Js 交互都做了一个示例。

# 说明

  1. 针对 QWebView 通过 QWebFrameaddToJavaScriptWindowObject 把对象传递到 Javascript
  2. 针对 QWebEngineView 通过 QWebChannel.registerObject('Bridge', QObject) 把对象传递到 Javascript
  3. 可以通过 @pyqtSlot 装饰器来申明该方法可以暴露给 Javascript 调用
@pyqtSlot(str)def callFromJs(self, text):    QMessageBox.information(self, "提示", "来自js调用:{}".format(text))
  1. 针对 QWebViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
// 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)Bridge.windowTitleChanged.connect({fun: function(title) {    showLog("标题被修改为:" + title);}}, "fun");// 绑定自定义的信号customSignalBridge.customSignal.connect({fun: function(text) {    showLog("收到自定义信号内容:" + text);}}, "fun");
  1. 针对 QWebEngineViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
new QWebChannel(qt.webChannelTransport,    function(channel) {        window.Bridge = channel.objects.Bridge;                // 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)        Bridge.windowTitleChanged.connect(function(title) {            showLog("标题被修改为:" + title);        });                // 绑定自定义的信号customSignal        Bridge.customSignal.connect(function(text) {           showLog("收到自定义信号内容:" + text);        });    });

# 代码

QWebViewhttps://github.com/PyQt5/PyQt/blob/master/QWebView/JsSignals.py

QWebEngineViewhttps://github.com/PyQt5/PyQt/blob/master/QWebEngineView/JsSignals.py

  1. 针对 QWebView 的核心实现
class WebView(QWebView):    customSignal = pyqtSignal(str)    def __init__(self, *args, **kwargs):        super(WebView, self).__init__(*args, **kwargs)        self.initSettings()        # 暴露接口对象        self.page().mainFrame().javaScriptWindowObjectCleared.connect(self._exposeInterface)    def _exposeInterface(self):        """向Js暴露调用本地方法接口        """        self.page().mainFrame().addToJavaScriptWindowObject('Bridge', self)    # 注意pyqtSlot用于把该函数暴露给js可以调用    @pyqtSlot(str)    def callFromJs(self, text):        QMessageBox.information(self, "提示", "来自js调用:{}".format(text))    def sendCustomSignal(self):        # 发送自定义信号        self.customSignal.emit('当前时间: ' + str(time()))
  1. 针对 QWebEngineView 的核心实现
class WebEngineView(QWebEngineView):    customSignal = pyqtSignal(str)    def __init__(self, *args, **kwargs):        super(WebEngineView, self).__init__(*args, **kwargs)        self.channel = QWebChannel(self)        # 把自身对象传递进去        self.channel.registerObject('Bridge', self)        # 设置交互接口        self.page().setWebChannel(self.channel)    # 注意pyqtSlot用于把该函数暴露给js可以调用    @pyqtSlot(str)    def callFromJs(self, text):        QMessageBox.information(self, "提示", "来自js调用:{}".format(text))    def sendCustomSignal(self):        # 发送自定义信号        self.customSignal.emit('当前时间: ' + str(time()))

# 效果图

JsSignals

]]>
+ + + <p>以前还是 <code>QWebView</code> 的时候和 <code>Javascript</code> 交互起来很方便,但是到了 Qt5.6 以后改用了 <code>QWebEngineView</code> ,并通过其提供的 <code>qwebchannel.js</code> 来进行交互。可能是由于刚出来的原因,这玩意儿有个 bug 就是必须在每次加载页面的时候手动注入,跳转页面后就失效了,需要手动注入,目前有没有修复具体未测试。这里对 <code>QWebView</code> 和 <code>QWebEngineView</code> 与 Js 交互都做了一个示例。</p> + + + + + + + + + + + + + + +
+ + + PyQt5窗口翻转动画 + + https://pyqt5.com/flipwidgetanimation.html + 2019-05-15T14:48:00.000Z + 2024-04-30T01:46:52.392Z + + QQ 的界面一直是用来模仿练习做界面的好东西,这里就有一个类似 QQ 登录界面的实现翻转效果,当然这里并没有用两个窗口去做,而是用了 QStackedWidget 包含两个控件做切换,同时单独使用一个窗口做动画绘制。

# 原理说明

  1. 用了两个 QLabel 来显示模拟的图片界面,并实现鼠标点击模拟真实的窗口对应位置点击
  2. 用了 QStackedWidget 来存放上面的两个界面 QLabel
  3. 点击切换时主要是对上面的两个界面进行截图并传递给翻转动画窗口
  4. 通过 setWindowOpacity 控制主窗口的显示隐藏(保留任务栏),当然也可以用 hide
  5. 动画窗口 FlipWidget.py 主要实现两张图片的翻转显示,考虑到 0-90 和 90-180 之前的情况,以及图片的缩放动画

# 核心实现

  1. 主要是在 paintEvent 方法中使用 QTransformQPainter 进行圆心变换以及 rotate 设置翻转角度
  2. 同时根据翻转的角度范围对图片进行切换和缩放
def paintEvent(self, event):    super(FlipWidget, self).paintEvent(event)    if hasattr(self, 'image1') and hasattr(self, 'image2') and self.isVisible():        painter = QPainter(self)        painter.setRenderHint(QPainter.Antialiasing, True)        painter.setRenderHint(QPainter.SmoothPixmapTransform, True)        # 变换        transform = QTransform()        # 把圆心设置为矩形中心        transform.translate(self.width() / 2, self.height() / 2)        if self._angle >= -90 and self._angle <= 90:            # 当翻转角度在90范围内显示第一张图,且从大图缩放到小图的过程            painter.save()            # 设置翻转角度            transform.rotate(self._angle, Qt.YAxis)            painter.setTransform(transform)            # 缩放图片高度            width = self.image1.width() / 2            height = int(self.image1.height() *                         (1 - abs(self._angle / self.Scale) / 100))            image = self.image1.scaled(                self.image1.width(), height,                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)            painter.drawPixmap(                QPointF(-width, -height / 2), image)            painter.restore()        else:            # 当翻转角度在90范围内显示第二张图,且从小图缩放到原图的过程            painter.save()            if self._angle > 0:                angle = 180 + self._angle            else:                angle = self._angle - 180            # 设置翻转角度, 注意这里角度有差异            transform.rotate(angle, Qt.YAxis)            painter.setTransform(transform)            # 缩放图片高度            width = self.image2.width() / 2            height = int(self.image2.height() *                         (1 - ((360 - abs(angle)) / self.Scale / 100)))            image = self.image2.scaled(                self.image2.width(), height,                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)            painter.drawPixmap(                QPointF(-width, -height / 2), image)            painter.restore()

# 代码

https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/FlipWidgetAnimation.py

# 效果图

FlipWidgetAnimation

]]>
+ + + <p>QQ 的界面一直是用来模仿练习做界面的好东西,这里就有一个类似 QQ 登录界面的实现翻转效果,当然这里并没有用两个窗口去做,而是用了 <code>QStackedWidget</code> 包含两个控件做切换,同时单独使用一个窗口做动画绘制。</p> + + + + + + + + + + + + +
+ + + PyQt属性动画(QPropertyAnimation) + + https://pyqt5.com/QPropertyAnimation.html + 2019-05-08T07:43:06.000Z + 2024-04-30T01:46:52.392Z + + QPropertyAnimation 继承自 QVariantAnimation ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 QObject 的对象中定义的属性做修改,
简单来说就是基类是 QObject 且定义了属性变量,就可以用 QPropertyAnimation 来做属性动画。同时也可以通过 pyqtProperty 来增加自定义属性。

首先,通过构造函数 QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None) 创建一个对象,其中

  1. 第一个参数是动画作用的对象,也可以通过 setTargetObject 设置
  2. 第二个参数是属性名,在 py3 中类型是 bytes,也可以通过 setPropertyName 设置

# 函数

一些常见的设置函数

setPropertyName设置属性名
setTargetObject设置动画作用对象
setDuration设置动画持续时间(毫秒)
setStartValue设置开始值
setEndValue设置结束值
setEasingCurve设置动画曲线
setKeyValueAt插入线性值
setLoopCount设置循环次数(-1 为永久)

# 示例

比如这个例子:

  1. 修改控件的 geometry 大小
  2. 修改自定义属性
  3. 修改进度条的 value 值

QPropertyAnimation

#!/usr/bin/env python# -*- coding: utf-8 -*-"""Created on 2019年5月8日@author: Irony@site: https://pyqt5.com https://github.com/892768447@email: 892768447@qq.com@file: @description: """from PyQt5.QtCore import QPropertyAnimation, QRect, pyqtProperty, QEasingCurvefrom PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout,\    QLabel, QProgressBar, QSpacerItem, QSizePolicy__Author__ = 'Irony'__Copyright__ = 'Copyright (c) 2019 Irony'__Version__ = 1.0class Window(QWidget):    def __init__(self, *args, **kwargs):        super(Window, self).__init__(*args, **kwargs)        self.resize(400, 400)        self._value = 0        self.button = QPushButton('属性动画测试', self)        self.button.clicked.connect(self.doStart)        self.button.setGeometry(0, 0, 80, 40)        self.buttonc = QPushButton('自定义属性 测试', self)        self.buttonc.clicked.connect(self.doStartCustom)        self.label = QLabel('', self)        self.progressbar = QProgressBar(self)        self.progressbar.setRange(0, 99)        layout = QVBoxLayout(self)        layout.addItem(QSpacerItem(            20, 60, QSizePolicy.Fixed, QSizePolicy.Fixed))        layout.addWidget(self.buttonc)        layout.addWidget(self.label)        layout.addWidget(self.progressbar)        # 进度条动画        self.progressStart()    # 此处是自定义属性,并通过动画修改后,设置QLabel的值    @pyqtProperty(int)    def value(self):        return self._value    @value.setter    def value(self, v):        self._value = v        self.label.setText('当前值:{}'.format(v))    def doStart(self):        # 第一个参数是要执行的对象        animation = QPropertyAnimation(self.button, b'geometry', self)        animation.setDuration(2000)  # 持续时间        # 缓和曲线风格,加了曲线动画会很大程度影响        animation.setEasingCurve(QEasingCurve.OutBounce)        animation.setStartValue(QRect(0, 0, 40, 40))        animation.setEndValue(QRect(250, 250, 80, 80))        animation.start(animation.DeleteWhenStopped)    def doStartCustom(self):        # 自定义属性动画        # 由于定义的属性是在继承的QWidget, 所以第一个参数是self        # 第二个参数就是 value        animation = QPropertyAnimation(self, b'value', self)        animation.setDuration(2000)  # 持续时间        animation.setStartValue(0)        animation.setEndValue(100)        animation.start(animation.DeleteWhenStopped)    def progressStart(self):        # 进度条动画        # 这里 value是QProgressBar自带的属性,具体可以看文档        # https://doc.qt.io/qt-5/qprogressbar.html#properties        animation = QPropertyAnimation(self.progressbar, b'value', self)        animation.setDuration(2000)  # 持续时间        animation.setLoopCount(-1)        # 这里采用插入线性值,第一个参数的范围是(0-1)        # 第二个参数的范围是进度(最小值-最大值)        animation.setKeyValueAt(0, self.progressbar.minimum())        animation.setKeyValueAt(0.1, 10)        animation.setKeyValueAt(0.2, 30)        animation.setKeyValueAt(0.5, 60)        animation.setKeyValueAt(0.7, 80)        animation.setKeyValueAt(1, self.progressbar.maximum())        animation.start(animation.DeleteWhenStopped)if __name__ == '__main__':    import sys    from PyQt5.QtWidgets import QApplication    app = QApplication(sys.argv)    w = Window()    w.show()    sys.exit(app.exec_())
]]>
+ + + <p><code>QPropertyAnimation</code> 继承自 <code>QVariantAnimation</code> ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 <code>QObject</code> 的对象中定义的属性做修改,<br> +简单来说就是基类是 <code>QObject</code> 且定义了属性变量,就可以用 <code>QPropertyAnimation</code> 来做属性动画。同时也可以通过 <code>pyqtProperty</code> 来增加自定义属性。</p> + + + + + + + + + + +
+ + + 如何查阅Qt文档 + + https://pyqt5.com/viewapi.html + 2019-05-04T12:50:20.000Z + 2024-04-30T01:46:52.396Z + + 很多网友在问有没有 PyQt5 的文档之类的问题,在 PyQt4 的时候 PyQt 官网有了英文版的文档,随后有网友翻译成了中文。不过现在 PyQt5 官方的文档都指向了 C 的 Qt 文档,其实 C 的 Qt API 文档结构很清晰,翻阅很容易的,需要注意几点。

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。

拿 Qt C++ 文档来说,官网地址是:https://doc.qt.io/qt-5/qtwidgets-module.html 这里面记录了所有控件的详细函数文档。

比如拿 输入框 QLineEdit 来说,怎么去查询它的用法和信号槽等资料?

https://doc.qt.io/qt-5/qlineedit.html

# 左侧目录

在文档左侧目录中有如下几个:

Properties - 控件里的属性(比如宽高等,通常需要当作函数调用)

Public Slots - 这个是控件自己的槽函数(当作普通函数就行)

Signals - 这个是输入框的包含的信号

Public Functions、Reimplemented Public Functions、Static Public Members、Protected Functions、Reimplemented Protected Functions - 这几个都是函数列表

howtoviewapi1

# 类说明

howtoviewapi2

这里有两个注意点

  1. 红色方框内的表示该控件(输入框)继承于 QWidget ,所以该控件(输入框)拥有父类的所有方法和信号,当当前文档找不到相关资料和函数时,可以去父类找找看。
  2. 紫色方框内表示列举所有的方法(包括父类)

# 函数列表

howtoviewapi3

这里列举的就是该控件(输入框)的函数,同理点击上面的紫色方框是查看所有方法,一般这里主要用来查询你需要的功能函数,Qt 的函数名比较容易理解,比如:只读 ReadOnly,选择文字:setSelection。

所以再查下这部分资料的时候建议在浏览器中 Ctrl + F 打开浏览器的搜索框,并输入英文关键词来检索你所需要的函数在哪里。

howtoviewapi8

# 槽函数

howtoviewapi4

这部分列举的是槽函数,其实在 PyQt 中槽函数可以当作普通的函数。普通的函数也可以作为槽函数,直接通过信号连接即可,注意方框所示,还有很多函数是在父类里面。

# 信号

howtoviewapi5

这部分列举了该控件(输入框)所定义的信号,主要还是看名字,大多都能知道是做什么的,比如:

  1. editingFinished - 编辑完成信号
  2. returnPressed - 回车键信号
  3. textChanged (const QString &text) - 内容改变信号

这里还有个问题就是参数问题,一般 & 后面的 text 作为参数传递到槽函数中

# 函数详细说明

当不明确这个函数是做什么的,可以点击该函数跳转到下面的说明,比如回车键信号 returnPressed

howtoviewapi6

如图上所示,用翻译插件翻译,大部分就明白了,如下:

howtoviewapi7

# 关于如何搜索资料

比如当你要搜索输入框内容改变事件,一般建议两种搜索,且搜索的时候用空格把关键词分开搜索,而且直接用控件名

  1. 中文搜索引擎:QLineEdit 内容 改变
  2. 英文搜索引擎:QLineEdit text change
]]>
+ + + <p>很多网友在问有没有 PyQt5 的文档之类的问题,在 PyQt4 的时候 PyQt 官网有了英文版的文档,随后有网友翻译成了中文。不过现在 PyQt5 官方的文档都指向了 C<ins> 的 Qt 文档,其实 C</ins> 的 Qt API 文档结构很清晰,翻阅很容易的,需要注意几点。</p> + + + + + + + + +
+ + + 推荐编辑器LiClipse + + https://pyqt5.com/suggesteditor.html + 2019-05-04T10:04:08.000Z + 2024-04-30T01:46:52.396Z + + 关于 Python 的开发编辑器有很多,每个人有每个人的喜好,经常看到很多在问什么编辑器好用,有人推荐 Sublime,有人推荐 Pycharm 等等,这里就不去比较其它编辑器的优缺点了,只谈谈关于 LiClipse 这个编辑器在初级使用阶段的智能提示功能等。开箱即用,支持多种语言,RST,Markdown 和 HTML 编辑器的 HTML 预览。

其实 LiClipse 这个编辑器就是以前的 PyDev 插件的独立版本,基于 Eclipse 编辑器开发,去掉了 Java 的相关开发功能,关于软件的详细说明可以去官网查看: http://www.liclipse.com/

编辑器只需要少量的配置,打开即可使用,快速自动 import,也可以根据需要安装自己所需的插件,比如 json、svn、主题插件等。个人推荐:适合刚入门的新手使用

由于新版的 PyQt 和 PyDev 去掉了详细的函数提示,所以 PyQt 的智能提示只有函数和返回值,并没有英文注释,但是以前的比如 PyQt4 的智能提示应该是有详细的英文注释提示。

# 界面预览

  1. 主界面
    editor1
  2. 鼠标悬停提示
    editor2
  3. 输入提示
    editor3
  4. Git 面板
    editor4
  5. 全局搜索(Ctrl + H)
    editor5
    editor6

# 自动导包

其实这个功能我是非常喜欢的,通过按下快捷键即可自动寻找包名导入,快捷键 Ctrl + Shift + O

editor_import

也可以在标红的代码上按下 Ctrl + F1 进行导入

editor_import2

# 配置

打开编辑器后首先要配置【Window -> Preferences】的就是 Python 的环境变量,可以同时添加多个 Python 版本

editor_env

# Tab 等设置

  1. Insert spaces for tabs tab 转空格
  2. Show line numbers 显示行号

editor_tab

# 模版

这个功能可以快速插入自己定义好的模版代码,比如 if __name__ == '__main__': 等等,比如我这里配置的创建文件的模版

editor_tpl

# 常用快捷键

格式化对齐Ctrl + Shift + F
自动导包Ctrl + Shift + O
快捷提示Alt + /
]]>
+ + + <p>关于 Python 的开发编辑器有很多,每个人有每个人的喜好,经常看到很多在问什么编辑器好用,有人推荐 Sublime,有人推荐 Pycharm 等等,这里就不去比较其它编辑器的优缺点了,只谈谈关于 LiClipse 这个编辑器在初级使用阶段的智能提示功能等。开箱即用,支持多种语言,RST,Markdown 和 HTML 编辑器的 HTML 预览。</p> + + + + + + + + +
+ + + 三种方式绑定信号槽 + + https://pyqt5.com/bindsignals.html + 2019-05-04T08:07:06.000Z + 2024-04-30T01:46:52.392Z + + 网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
这几种方式各有各的优点和缺点。

# 方式一

这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectNameQtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:

self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))self.pushButton.setObjectName("pushButton")# 通过这里自动完成连接信号槽QtCore.QMetaObject.connectSlotsByName(Form)

此时只需要继承该 UI 文件类然后增加如下方法:

@pyqtSlot()def on_pushButton_clicked(self):    print('button clicked')

这里解释一下, @pyqtSlot() 装饰器把函数 on_pushButton_clicked 包装为一个槽函数,
QtCore.QMetaObject.connectSlotsByName(Form) 这句代码的意思就是自动去寻找满足的槽函数

注意:这里有个规范(on_xxxx_clicked),这里必须要满足 on_控件的objectName_控件的信号 这样下划线连接起来的函数名才能被识别,
比如按钮的点击: on_pushButton_clicked 、勾选框的选中: on_checkbox_toggled(self, checked)

# 方式二

这种方式则直接通过代码里调用控件的信号的 connect 方法来进行绑定,比如:

# 按钮点击函数def doClicked(self):    print(self.sender(), 'clicked')# 绑定点击信号self.pushButton.clicked.connect(self.doClicked)

注意: connect 的是函数名字self.sender() 这句代码是获取信号发送者(比如这里就是得到这个按钮对象),
用处在于有时候要循环创建一堆按钮

# 方式三

通过参数这种方式其实比较特殊,在 PyQt 中大部分存在,但是在 PySide 中则很少,原因是两者的封装方式不同。

同时该方式用于在纯代码中比较常见,而且需要对该控件有那些信号可以用要很熟习,比如:

# 按钮点击函数def doClicked(self):    print(self.sender(), 'clicked')pushButton = QPushButton('按钮', self, clicked=self.doClicked, minimumHeight=40)

这里可以通过参数(信号名字) = 函数来绑定信号

同时也可以设置其它参数,比如
button.setMinimumHeight(40) 也可以像参数里那样设置 minimumHeight=40

]]>
+ + + <p>网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,<br> +这几种方式各有各的优点和缺点。</p> + + + + + + + + + + +
+ + + python 拷贝虚拟环境(一)   + + https://pyqt5.com/virtualenvpy_625781186.html + 2019-05-02T07:21:01.000Z + 2024-04-30T01:46:52.396Z + + 通常来说,刚开始使用 python 的时候都是把包装到全局路径,随着各个项目安装的包越来越多,之后每开始一个项目,pycharm 创建索引的时间都越来越漫长,所以不可避免得开始使用虚拟环境。
经过一番了解 ,虚拟环境的优点有这些:

  • 改善 pycharm 索引时间;
  • 各个项目的库不会冲突;
  • 理论上虚拟环境可以给同版本的操作系统使用 (未试验过);
  • pip freeze > requestment.txt 导出的依赖清晰;
  • 各个版本的 python 共存;

python 虚拟环境库除了自带的 venv , 还有三方库 virtualenv , 此外 在 virtualenv 基础上又开发了 virtualenvwrapper(virtualenvwrapper_win) 来管理

本文基于 virtualenvwrapper 创建的虚拟环境来讲解.

以下是收集的一些virtualenvwrapper配置教程:# linux平台https://www.cnblogs.com/netfoxman/p/5994697.html# window平台https://blog.csdn.net/shaququ/article/details/54292043   https://blog.csdn.net/iaau0908/article/details/54021518

虚拟环境创建多了我们就会发现,
有时候使用相同版本的环境,一些常用的库是需要重新安装的,
那么能不能创建一个基础环境,默认拥有这些库,然后在这个基础环境上继续安装三方库呢?

本文经过试验发现是可行的:

  1. 创建基础虚拟环境 mkvirtualenv <环境名称> [-p空格python其他版本的解释器路径] . 例如 mkvirtualenv py34 -p c:\Python34\python.exe

  2. 切换到虚拟环境 workon py34 , 然后安装一下三方库,然后复制 py34 这个文件夹备份一下;

  3. 接着复制这个 py34 文件夹,把复制后的文件夹改名为我们需要需要的文件夹例如 new34

  4. 进入 new34文件夹 ,用任意编辑器全路径搜索 py34 (替换虚拟环境的路径)

  5. 删除 new34/Scripts 下的 pip.exe, pip3.exe, pip3.x.exe, easy_install.exe (因为安装路径硬编码到这里面了,改不了,需要重新安装)

  6. https://blog.csdn.net/douniwan007009/article/details/81463958 按方式二,源码安装 setuptools 后再用 easy_install pip 安装 pip 后,完成;
    如果有问题,就继续按照方式一的源码安装 pip;

  7. new34 环境下 用 pip show 三方库 来看一些库的位置,确保正确.

]]>
+ + + <p>通常来说,刚开始使用 python 的时候都是把包装到全局路径,随着各个项目安装的包越来越多,之后每开始一个项目,pycharm 创建索引的时间都越来越漫长,所以不可避免得开始使用虚拟环境。<br> +经过一番了解 ,虚拟环境的优点有这些:</p> +<ul> +<li>改善 pycharm 索引时间;</li> +<li>各个项目的库不会冲突;</li> +<li>理论上虚拟环境可以给同版本的操作系统使用 (未试验过);</li> +<li>pip freeze &gt; requestment.txt 导出的依赖清晰;</li> +<li>各个版本的 python 共存;</li> +<li>…</li> +</ul> + + + + + + + + + + + + +
+ + + QRunnable线程池发信号 + + https://pyqt5.com/runnablesignal_625781186.html + 2019-04-30T07:58:09.000Z + 2024-04-30T01:46:52.392Z + + 因为只有继承 QObject 的类才能有信号和自定义信号,而 QRunnable 并不是继承自 QObject ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。

pools 是 QThreadPool 实例

# 看图说话

  1. runnablesignal1
  2. 定义一个全局信号类
    runnablesignal2
  3. 在 QRunnable 中发送
    runnablesignal3
]]>
+ + + <p>因为只有继承 <code>QObject</code> 的类才能有信号和自定义信号,而 <code>QRunnable</code> 并不是继承自 <code>QObject</code> ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。</p> + + + + + + + + + + + + +
+ + + 如何和设计师中查看ui转换的py代码 + + https://pyqt5.com/viewpyindesigner_625781186.html + 2019-04-30T05:11:09.000Z + 2024-04-30T01:46:52.396Z + + 通过 设计师  查看 ui 转换的 py 代码

当初我刚学 pyqt 的时候,也有很多疑惑,用什么属性把控件加到布局,改了这个属性会发生什么,为什么这个会这样,那个会那样 。。。 。。。

后来就看 ui 转成的 py 代码,注释一下,什么效果消失了,就是那个 api 引起的 。

再来后发现了官方文档,查一查函数就行了 .

但是有些 api 文档找起来麻烦,用设计师点几下就行了,然后把转换出来的代码拷贝一下就完事了.

可是需要单独把 ui 转为 py 文件,之后再删除这个文件也是很烦的一件事 .

好,话不多说,接下来手把手教你如何快速在 ui 中查看 py 代码 .

官方也考虑过这种情况,所以 设计师中 是有这个功能的,但是 qt 的是没问题的,pyqt 的毕竟是绑定过来的,所以正常来说 你点击之后会弹出一个找不到应用程序的提示 .

看到这个东西是不是很眼熟,我们用的命令 pyuic5 和这个东西应该是一样的 .

viewpyindesigner1

所以接下来,我们找找电脑上有没有这个东西

viewpyindesigner2

果然在 pyqt5-toos 文件夹下有这个东西,

我们根据第一张图的提示,把这个东西拷贝到相应的目录 (如果没有那个 bin 文件夹,手动创建),

viewpyindesigner3

好了,大功告成!

]]>
+ + + <p>通过 设计师  查看 ui 转换的 py 代码</p> +<p>当初我刚学 pyqt 的时候,也有很多疑惑,用什么属性把控件加到布局,改了这个属性会发生什么,为什么这个会这样,那个会那样 。。。 。。。</p> +<p>后来就看 ui 转成的 py 代码,注释一下,什么效果消失了,就是那个 api 引起的 。</p> + + + + + + + + + + + + +
+ + + PyQt5调整窗口显示边框 + + https://pyqt5.com/showframe.html + 2019-04-26T14:19:26.000Z + 2024-04-30T01:46:52.392Z + + windows 某些场景下调整窗口大小或者移动后就会导致里面的内容重绘(速度慢,卡顿,闪烁),其实在以前 windows 在低配置设备为了减少这种频繁绘制的情况,默认会开启这种效果,不过目前设备越来越好了就关闭了该功能。具体是在控制面板中 -> 调整 Windows 的外观和性能 -> 去掉勾选 拖动时显示窗口内容。

由于这个开关是全局状态的,而我们只需要在自己的窗口中实现该效果有两种方式。

  1. 一种是自己绘制一个边框效果,放开鼠标时才操作真正的窗口。
  2. 二是替换窗口的处理过程函数 wndproc 处理 WM_NCLBUTTONDOWN 消息事件。

今天讲第二种方法:

  1. 需要了解 SystemParametersInfo  API 函数
  2. SPI_GETDRAGFULLWINDOWS :确定是否允许拖拉到最大窗口
  3. SPI_SETDRAGFULLWINDOWS :设置是否允许拖至最大窗口

效果就是这样的:

ShowFrameWhenDrag

正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在移动的时候出现闪烁的现象。

# 代码

https://github.com/PyQt5/PyQt/blob/master/Demo/ShowFrameWhenDrag.py

#!/usr/bin/env python# -*- coding: utf-8 -*-"""Created on 2019年4月23日@author: Irony@site: https://pyqt5.com https://github.com/892768447@email: 892768447@qq.com@file: ShowFrameWhenDrag@description: 调整窗口显示边框"""from ctypes import sizeof, windll, c_int, byref, c_long, c_void_p, c_ulong, c_longlong,\    c_ulonglong, WINFUNCTYPE, c_uintfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel__Author__ = 'Irony'__Copyright__ = 'Copyright (c) 2019 Irony'__Version__ = 1.0if sizeof(c_long) == sizeof(c_void_p):    WPARAM = c_ulong    LPARAM = c_longelif sizeof(c_longlong) == sizeof(c_void_p):    WPARAM = c_ulonglong    LPARAM = c_longlongWM_NCLBUTTONDOWN = 0x00a1GWL_WNDPROC = -4SPI_GETDRAGFULLWINDOWS = 38SPI_SETDRAGFULLWINDOWS = 37WNDPROC = WINFUNCTYPE(c_long, c_void_p, c_uint, WPARAM, LPARAM)try:    CallWindowProc = windll.user32.CallWindowProcW    SetWindowLong = windll.user32.SetWindowLongW    SystemParametersInfo = windll.user32.SystemParametersInfoWexcept:    CallWindowProc = windll.user32.CallWindowProcA    SetWindowLong = windll.user32.SetWindowLongA    SystemParametersInfo = windll.user32.SystemParametersInfoAdef GetDragFullwindows():    rv = c_int()    SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, byref(rv), 0)    return rv.valuedef SetDragFullwindows(value):    SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, value, 0, 0)class Window(QWidget):    def __init__(self, *args, **kwargs):        super(Window, self).__init__(*args, **kwargs)        layout = QVBoxLayout(self)        layout.addWidget(QLabel('拖动或者调整窗口试试看'))        # 重点替换窗口处理过程        self._newwndproc = WNDPROC(self._wndproc)        self._oldwndproc = SetWindowLong(            int(self.winId()), GWL_WNDPROC, self._newwndproc)    def _wndproc(self, hwnd, msg, wparam, lparam):        if msg == WM_NCLBUTTONDOWN:            # 获取系统本身是否已经开启            isDragFullWindow = GetDragFullwindows()            if isDragFullWindow != 0:                # 开启虚线框                SetDragFullwindows(0)                # 系统本身处理                ret = CallWindowProc(                    self._oldwndproc, hwnd, msg, wparam, lparam)                # 关闭虚线框                SetDragFullwindows(1)                return ret        return CallWindowProc(self._oldwndproc, hwnd, msg, wparam, lparam)if __name__ == '__main__':    import sys    from PyQt5.QtWidgets import QApplication    app = QApplication(sys.argv)    w = Window()    w.show()    sys.exit(app.exec_())

# 片尾

替换窗口过程可以处理很多系统窗口的处理过程,更多需要读者自行去发现。

]]>
+ + + <p>在 <code>windows</code> 某些场景下调整窗口大小或者移动后就会导致里面的内容重绘(速度慢,卡顿,闪烁),其实在以前 <code>windows</code> 在低配置设备为了减少这种频繁绘制的情况,默认会开启这种效果,不过目前设备越来越好了就关闭了该功能。具体是在控制面板中 -&gt; 调整 <code>Windows</code> 的外观和性能 -&gt; 去掉勾选 拖动时显示窗口内容。</p> + + + + + + + + + + +
+ + + PyQt5判断信号是否连接 + + https://pyqt5.com/issignalconnected.html + 2019-04-26T14:06:26.000Z + 2024-04-30T01:46:52.392Z + + PyQt 中某些情况下需要取消原来的信号连接,此时需要使用 disconnect 方法,但是在逻辑不严谨的情况下可能会导致多次调用 disconnect 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过  isSignalConnected  来判断信号是否连接。

在 QOjbect 文档中这样写到:

static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);if (isSignalConnected(valueChangedSignal)) {    QByteArray data;    data = get_the_value();       // expensive operation    emit valueChanged(data);}

通过直接传入信号就行了,但是这在 PyQt 中不可行。需要这么做

#!/usr/bin/env python# -*- coding: utf-8 -*-"""Created on 2019年2月24日@author: Irony@site: https://pyqt5.com https://github.com/892768447@email: 892768447@qq.com@file: IsSignalConnected@description: 判断信号是否连接"""from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QTextBrowser__Author__ = """By: IronyQQ: 892768447Email: 892768447@qq.com"""__Copyright__ = 'Copyright (c) 2019 Irony'__Version__ = 1.0class Window(QWidget):    def __init__(self, *args, **kwargs):        super(Window, self).__init__(*args, **kwargs)        layout = QVBoxLayout(self)        self.button1 = QPushButton('已连接', self, clicked=self.doTest)        self.button2 = QPushButton('未连接', self)        self.retView = QTextBrowser(self)        layout.addWidget(self.button1)        layout.addWidget(self.button2)        layout.addWidget(self.retView)    def doTest(self):        self.retView.append("""        # button1 clicked 是否连接: %s        # button2 clicked 是否连接: %s        """ % (            self.isSignalConnected(self.button1, 'clicked()'),            self.isSignalConnected(self.button2, 'clicked()')        ))    def isSignalConnected(self, obj, name):        """判断信号是否连接        :param obj:        对象        :param name:       信号名,如 clicked()        """        index = obj.metaObject().indexOfMethod(name)        if index > -1:            method = obj.metaObject().method(index)            if method:                return obj.isSignalConnected(method)        return Falseif __name__ == '__main__':    import sys    from PyQt5.QtWidgets import QApplication    app = QApplication(sys.argv)    w = Window()    w.show()    sys.exit(app.exec_())

# 效果图

IsSignalConnected

]]>
+ + + <p>在 <code>PyQt</code> 中某些情况下需要取消原来的信号连接,此时需要使用 <code>disconnect</code> 方法,但是在逻辑不严谨的情况下可能会导致多次调用 <code>disconnect</code> 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过  <code>isSignalConnected</code>  来判断信号是否连接。</p> + + + + + + + + + + +
+ +
diff --git a/baidusitemap.xml b/baidusitemap.xml new file mode 100644 index 00000000..57b2f74e --- /dev/null +++ b/baidusitemap.xml @@ -0,0 +1,167 @@ + + + + https://pyqt5.com/suggesteditor.html + 2024-04-30 + + + https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html + 2024-04-30 + + + https://pyqt5.com/viewapi.html + 2024-04-30 + + + https://pyqt5.com/viewpyindesigner_625781186.html + 2024-04-30 + + + https://pyqt5.com/webviewnew.html + 2024-04-30 + + + https://pyqt5.com/virtualenvpy_625781186.html + 2024-04-30 + + + https://pyqt5.com/QPropertyAnimation.html + 2024-04-30 + + + https://pyqt5.com/animateshadow.html + 2024-04-30 + + + https://pyqt5.com/bindsignals.html + 2024-04-30 + + + https://pyqt5.com/calljava.html + 2024-04-30 + + + https://pyqt5.com/cgitb.html + 2024-04-30 + + + https://pyqt5.com/circleimage.html + 2024-04-30 + + + https://pyqt5.com/daemonthread.html + 2024-04-30 + + + https://pyqt5.com/datawidgetmapper_625781186.html + 2024-04-30 + + + https://pyqt5.com/equal_str_width_625781186.html + 2024-04-30 + + + https://pyqt5.com/ffmpeghls.html + 2024-04-30 + + + https://pyqt5.com/flipwidgetanimation.html + 2024-04-30 + + + https://pyqt5.com/followwindow.html + 2024-04-30 + + + https://pyqt5.com/issignalconnected.html + 2024-04-30 + + + https://pyqt5.com/jumpslider.html + 2024-04-30 + + + https://pyqt5.com/likehtmleffect.html + 2024-04-30 + + + https://pyqt5.com/macm1pyqt.html + 2024-04-30 + + + https://pyqt5.com/mselectmenu.html + 2024-04-30 + + + https://pyqt5.com/pageswitching.html + 2024-04-30 + + + https://pyqt5.com/processinclass_625781186.html + 2024-04-30 + + + https://pyqt5.com/pyqt5_hook_key_625781186.html + 2024-04-30 + + + https://pyqt5.com/pyqt5asyncio.html + 2024-04-30 + + + https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html + 2024-04-30 + + + https://pyqt5.com/pyqtclient.html + 2024-04-30 + + + https://pyqt5.com/pyqtclientmac.html + 2024-04-30 + + + https://pyqt5.com/pytest_qt_modal_625781186.html + 2024-04-30 + + + https://pyqt5.com/python_statemachine_625781186.html + 2024-04-30 + + + https://pyqt5.com/qtninepatch.html + 2024-04-30 + + + https://pyqt5.com/qtwebjs.html + 2024-04-30 + + + https://pyqt5.com/read_open_source.html + 2024-04-30 + + + https://pyqt5.com/rlatticeeffect.html + 2024-04-30 + + + https://pyqt5.com/runnablesignal_625781186.html + 2024-04-30 + + + https://pyqt5.com/shadowradius.html + 2024-04-30 + + + https://pyqt5.com/showframe.html + 2024-04-30 + + + https://pyqt5.com/speedgithub.html + 2024-04-30 + + + https://pyqt5.com/studynotes.html + 2024-04-30 + + \ No newline at end of file diff --git a/bindsignals.html b/bindsignals.html new file mode 100644 index 00000000..d1cdba8b --- /dev/null +++ b/bindsignals.html @@ -0,0 +1,314 @@ +三种方式绑定信号槽 | PyQt + + + + + + + + + + + + + + +

三种方式绑定信号槽

网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
+这几种方式各有各的优点和缺点。

+ +

# 方式一

+

这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectNameQtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
+比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:

+
self.pushButton = QtWidgets.QPushButton(Form)
+self.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))
+self.pushButton.setObjectName("pushButton")
+
+# 通过这里自动完成连接信号槽
+QtCore.QMetaObject.connectSlotsByName(Form)
+

此时只需要继承该 UI 文件类然后增加如下方法:

+

+@pyqtSlot()
+def on_pushButton_clicked(self):
+    print('button clicked')
+

这里解释一下, @pyqtSlot() 装饰器把函数 on_pushButton_clicked 包装为一个槽函数,
+而 QtCore.QMetaObject.connectSlotsByName(Form) 这句代码的意思就是自动去寻找满足的槽函数

+

注意:这里有个规范(on_xxxx_clicked),这里必须要满足 on_控件的objectName_控件的信号 这样下划线连接起来的函数名才能被识别,
+比如按钮的点击: on_pushButton_clicked 、勾选框的选中: on_checkbox_toggled(self, checked)

+

# 方式二

+

这种方式则直接通过代码里调用控件的信号的 connect 方法来进行绑定,比如:

+
# 按钮点击函数
+def doClicked(self):
+    print(self.sender(), 'clicked')
+
+# 绑定点击信号
+self.pushButton.clicked.connect(self.doClicked)
+

注意: connect 的是函数名字self.sender() 这句代码是获取信号发送者(比如这里就是得到这个按钮对象),
+用处在于有时候要循环创建一堆按钮

+

# 方式三

+

通过参数这种方式其实比较特殊,在 PyQt 中大部分存在,但是在 PySide 中则很少,原因是两者的封装方式不同。

+

同时该方式用于在纯代码中比较常见,而且需要对该控件有那些信号可以用要很熟习,比如:

+

+# 按钮点击函数
+def doClicked(self):
+    print(self.sender(), 'clicked')
+
+pushButton = QPushButton('按钮', self, clicked=self.doClicked, minimumHeight=40)
+

这里可以通过参数(信号名字) = 函数来绑定信号

+

同时也可以设置其它参数,比如
+ button.setMinimumHeight(40) 也可以像参数里那样设置 minimumHeight=40

+
文章作者: Irony
文章链接: https://pyqt5.com/bindsignals.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/calljava.html b/calljava.html new file mode 100644 index 00000000..2cc67f1a --- /dev/null +++ b/calljava.html @@ -0,0 +1,372 @@ +Python调用Java对Excel截图 | PyQt + + + + + + + + + + + + + + +

Python调用Java对Excel截图

有的时候会遇到一些奇葩的需求,就是用 Excel 做报表,但是需要对里面的数据进行填充并生成报表图片,发送出去。这里记录用 python 调用 jar 包对 excel 文件进行公式计算和截图,数据填充可以用 xlrd 或者 openpyxl

+ +

利用 jpype 模块初始化 java 虚拟机加载 jar 包然后执行其中的功能。

+

# 代码

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2019年3月12日
+@author: Irony
+@site: https://pyqt5.com https://github.com/892768447
+@email: 892768447@qq.com
+@file: CallJava
+@description: 
+"""
+import os
+
+import jpype
+
+
+__Author__ = 'Irony'
+__Copyright__ = 'Copyright (c) 2019'
+
+
+def convertToImage():
+    Workbook = jpype.JClass('com.aspose.cells.Workbook')
+    ImageFormat = jpype.JClass('com.aspose.cells.ImageFormat')
+    ImageOrPrintOptions = jpype.JClass(
+        'com.aspose.cells.ImageOrPrintOptions')
+    SheetRender = jpype.JClass('com.aspose.cells.SheetRender')
+
+    book = Workbook(os.path.abspath('data/test.xlsx').replace('\\', '/'))
+    # 保存为html
+    book.save('data/index.html', 12)
+    # 保存为pdf
+    book.save('data/test.pdf')
+
+    # 截图
+    imgOptions = ImageOrPrintOptions()
+    # imgOptions.setQuality(100)
+    imgOptions.setOnePagePerSheet(True)
+
+    # 输出图片格式
+#     imgOptions.setImageFormat(ImageFormat.getJpeg())
+    imgOptions.setImageFormat(ImageFormat.getPng())
+
+    # 计算
+    CalculationOptions = jpype.JClass(
+        'com.aspose.cells.CalculationOptions')
+    opt = CalculationOptions()
+    # 对Sheet1中的公式进行计算
+    sheet = book.getWorksheets().get('Sheet1')
+    sheet.calculateFormula(opt, True)
+
+    # 设置区域
+    pageSetup = sheet.getPageSetup()
+    # 去掉边距
+    pageSetup.setBottomMargin(0.)
+    pageSetup.setLeftMargin(0.)
+    pageSetup.setRightMargin(0.)
+    pageSetup.setTopMargin(0.)
+    # 设置要截图的区域(对角线)
+    pageSetup.setPrintArea('A0:C2')
+    # Create a SheetRender object for the target sheet
+    sr = SheetRender(sheet, imgOptions)
+    for page in range(sr.getPageCount()):
+        # Generate an image for the worksheet
+        sr.toImage(
+            page, os.path.join('data', '%d.png' % (page + 1)))
+
+
+def test():
+    # emm这里不知道什么用绝对路径就报错
+    libs = '{};{}'.format(
+        'libs/bcprov-jdk16-146.jar',
+        'libs/aspose-cells-19.2.jar'
+    )
+    command = (jpype.getDefaultJVMPath(),
+                   '-ea', '-Xmn128m', '-Xms512M', '-Xmx512M',
+                   '-Djava.class.path={0}'.format(libs))
+    print(command)
+    jpype.startJVM(jpype.getDefaultJVMPath(),
+                   '-ea', '-Xmn128m', '-Xms512M', '-Xmx512M',
+                   '-Djava.class.path={0}'.format(libs)
+                   )
+    # 解决多线程问题
+    jpype.attachThreadToJVM()
+    # 对excel截图
+    convertToImage()
+    # 关闭虚拟机
+    jpype.shutdownJVM()
+    print('截图完成')
+
+
+if __name__ == '__main__':
+    test()
+

# 附件

+

调用 java 生成报表.7z

+

解压后进入 whls 文件夹安装对应版本的 jpype 包

+

# 效果图

+

calljava

+
文章作者: Irony
文章链接: https://pyqt5.com/calljava.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 00000000..b9cb7da0 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,278 @@ +分类 | PyQt + + + + + + + + + + + + + +
\ No newline at end of file diff --git "a/categories/\344\276\213\345\255\220/index.html" "b/categories/\344\276\213\345\255\220/index.html" new file mode 100644 index 00000000..05dab9d7 --- /dev/null +++ "b/categories/\344\276\213\345\255\220/index.html" @@ -0,0 +1,443 @@ +分类: 例子 | PyQt + + + + + + + + + + + +
QtWebkit和QWebEngineView与Javascript交互
PyQt5窗口翻转动画
PyQt5无边框圆角阴影
PyQt5之图片轮播
PyQt5之QSlider滑动条点击定位
PyQt5仿网页鼠标移动点阵特效
QDataWidgetMapper 数据库绑定 QLineEdit控件
PyQt5显示.9格式的PNG图片
PyQt5菜单之多选功能
PyQt5结合Asyncio异步
\ No newline at end of file diff --git "a/categories/\344\276\213\345\255\220/page/2/index.html" "b/categories/\344\276\213\345\255\220/page/2/index.html" new file mode 100644 index 00000000..a8b6c129 --- /dev/null +++ "b/categories/\344\276\213\345\255\220/page/2/index.html" @@ -0,0 +1,362 @@ +分类: 例子 | PyQt + + + + + + + + + + + +
PyQt5仿网页图片鼠标移动特效
PyQt5窗口跟随其它窗口
PyQt5动画边框阴影
PyQt5圆形图片
\ No newline at end of file diff --git "a/categories/\346\225\231\347\250\213/index.html" "b/categories/\346\225\231\347\250\213/index.html" new file mode 100644 index 00000000..2c7569d0 --- /dev/null +++ "b/categories/\346\225\231\347\250\213/index.html" @@ -0,0 +1,426 @@ +分类: 教程 | PyQt + + + + + + + + + + + +
pytest-qt 测试模态窗体.
三种方式绑定信号槽
QRunnable线程池发信号
如何和设计师中查看ui转换的py代码
PyQt5调整窗口显示边框
PyQt5判断信号是否连接
在Mac上以正确的姿势使用PyQtClient看Demo
Python调用Java对Excel截图
PyQt5编译QWebView与QWebEngineView共存
\ No newline at end of file diff --git "a/categories/\347\254\224\350\256\260/index.html" "b/categories/\347\254\224\350\256\260/index.html" new file mode 100644 index 00000000..e3d667b3 --- /dev/null +++ "b/categories/\347\254\224\350\256\260/index.html" @@ -0,0 +1,437 @@ +分类: 笔记 | PyQt + + + + + + + + + + + +
如何在Mac M1上快速安装PyQt5
PyQt学习心得
PyQt属性动画(QPropertyAnimation)
如何查阅Qt文档
解决GitHub下载速度缓慢的问题
FFmpeg合成加密HLS记录
python 在类里使用进程池
多线程之守护线程和阻塞线程
异常捕获之cgitb模块
\ No newline at end of file diff --git "a/categories/\351\232\217\347\254\224/index.html" "b/categories/\351\232\217\347\254\224/index.html" new file mode 100644 index 00000000..59d804bc --- /dev/null +++ "b/categories/\351\232\217\347\254\224/index.html" @@ -0,0 +1,417 @@ +分类: 随笔 | PyQt + + + + + + + + + + + +
python 判断屏幕等宽字符串的长度  
修改pyuic代替pyside2-uic.
python 状态机模块  
在pyqt中使用python全局钩子模块
像读文章一样读源码
python 获取子进程print信息  
推荐编辑器LiClipse
python 拷贝虚拟环境(一)  
PyQtClient例子客户端
\ No newline at end of file diff --git "a/category/\344\276\213\345\255\220/feed.json" "b/category/\344\276\213\345\255\220/feed.json" new file mode 100644 index 00000000..8daf7b97 --- /dev/null +++ "b/category/\344\276\213\345\255\220/feed.json" @@ -0,0 +1,174 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "PyQt • All posts by \"例子\" category", + "description": "Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6", + "home_page_url": "https://pyqt5.com", + "items": [ + { + "id": "https://pyqt5.com/qtwebjs.html", + "url": "https://pyqt5.com/qtwebjs.html", + "title": "QtWebkit和QWebEngineView与Javascript交互", + "date_published": "2019-05-22T03:30:36.000Z", + "content_html": "

以前还是 QWebView 的时候和 Javascript 交互起来很方便,但是到了 Qt5.6 以后改用了 QWebEngineView ,并通过其提供的 qwebchannel.js 来进行交互。可能是由于刚出来的原因,这玩意儿有个 bug 就是必须在每次加载页面的时候手动注入,跳转页面后就失效了,需要手动注入,目前有没有修复具体未测试。这里对 QWebViewQWebEngineView 与 Js 交互都做了一个示例。

\n\n

# 说明

\n
    \n
  1. 针对 QWebView 通过 QWebFrameaddToJavaScriptWindowObject 把对象传递到 Javascript
  2. \n
  3. 针对 QWebEngineView 通过 QWebChannel.registerObject('Bridge', QObject) 把对象传递到 Javascript
  4. \n
  5. 可以通过 @pyqtSlot 装饰器来申明该方法可以暴露给 Javascript 调用
  6. \n
\n
@pyqtSlot(str)\ndef callFromJs(self, text):\n    QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))
\n
    \n
  1. 针对 QWebViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
  2. \n
\n
// 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)\nBridge.windowTitleChanged.connect({fun: function(title) {\n    showLog(\"标题被修改为:\" + title);\n}}, \"fun\");\n\n// 绑定自定义的信号customSignal\nBridge.customSignal.connect({fun: function(text) {\n    showLog(\"收到自定义信号内容:\" + text);\n}}, \"fun\");
\n
    \n
  1. 针对 QWebEngineViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
  2. \n
\n
new QWebChannel(qt.webChannelTransport,\n    function(channel) {\n        window.Bridge = channel.objects.Bridge;\n        \n        // 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)\n        Bridge.windowTitleChanged.connect(function(title) {\n            showLog(\"标题被修改为:\" + title);\n        });\n        \n        // 绑定自定义的信号customSignal\n        Bridge.customSignal.connect(function(text) {\n           showLog(\"收到自定义信号内容:\" + text);\n        });\n    }\n);
\n

# 代码

\n

QWebViewhttps://github.com/PyQt5/PyQt/blob/master/QWebView/JsSignals.py

\n

QWebEngineViewhttps://github.com/PyQt5/PyQt/blob/master/QWebEngineView/JsSignals.py

\n
    \n
  1. 针对 QWebView 的核心实现
  2. \n
\n
class WebView(QWebView):\n\n    customSignal = pyqtSignal(str)\n\n    def __init__(self, *args, **kwargs):\n        super(WebView, self).__init__(*args, **kwargs)\n        self.initSettings()\n        # 暴露接口对象\n        self.page().mainFrame().javaScriptWindowObjectCleared.connect(self._exposeInterface)\n\n    def _exposeInterface(self):\n        \"\"\"向Js暴露调用本地方法接口\n        \"\"\"\n        self.page().mainFrame().addToJavaScriptWindowObject('Bridge', self)\n\n    # 注意pyqtSlot用于把该函数暴露给js可以调用\n    @pyqtSlot(str)\n    def callFromJs(self, text):\n        QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))\n\n    def sendCustomSignal(self):\n        # 发送自定义信号\n        self.customSignal.emit('当前时间: ' + str(time()))
\n
    \n
  1. 针对 QWebEngineView 的核心实现
  2. \n
\n
class WebEngineView(QWebEngineView):\n\n    customSignal = pyqtSignal(str)\n\n    def __init__(self, *args, **kwargs):\n        super(WebEngineView, self).__init__(*args, **kwargs)\n        self.channel = QWebChannel(self)\n        # 把自身对象传递进去\n        self.channel.registerObject('Bridge', self)\n        # 设置交互接口\n        self.page().setWebChannel(self.channel)\n\n    # 注意pyqtSlot用于把该函数暴露给js可以调用\n    @pyqtSlot(str)\n    def callFromJs(self, text):\n        QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))\n\n    def sendCustomSignal(self):\n        # 发送自定义信号\n        self.customSignal.emit('当前时间: ' + str(time()))
\n

# 效果图

\n

\"JsSignals\"

\n", + "tags": [ + "PyQt", + "QWebView", + "QWebEngineView", + "浏览器" + ] + }, + { + "id": "https://pyqt5.com/flipwidgetanimation.html", + "url": "https://pyqt5.com/flipwidgetanimation.html", + "title": "PyQt5窗口翻转动画", + "date_published": "2019-05-15T14:48:00.000Z", + "content_html": "

QQ 的界面一直是用来模仿练习做界面的好东西,这里就有一个类似 QQ 登录界面的实现翻转效果,当然这里并没有用两个窗口去做,而是用了 QStackedWidget 包含两个控件做切换,同时单独使用一个窗口做动画绘制。

\n\n

# 原理说明

\n
    \n
  1. 用了两个 QLabel 来显示模拟的图片界面,并实现鼠标点击模拟真实的窗口对应位置点击
  2. \n
  3. 用了 QStackedWidget 来存放上面的两个界面 QLabel
  4. \n
  5. 点击切换时主要是对上面的两个界面进行截图并传递给翻转动画窗口
  6. \n
  7. 通过 setWindowOpacity 控制主窗口的显示隐藏(保留任务栏),当然也可以用 hide
  8. \n
  9. 动画窗口 FlipWidget.py 主要实现两张图片的翻转显示,考虑到 0-90 和 90-180 之前的情况,以及图片的缩放动画
  10. \n
\n

# 核心实现

\n
    \n
  1. 主要是在 paintEvent 方法中使用 QTransformQPainter 进行圆心变换以及 rotate 设置翻转角度
  2. \n
  3. 同时根据翻转的角度范围对图片进行切换和缩放
  4. \n
\n
def paintEvent(self, event):\n    super(FlipWidget, self).paintEvent(event)\n\n    if hasattr(self, 'image1') and hasattr(self, 'image2') and self.isVisible():\n\n        painter = QPainter(self)\n        painter.setRenderHint(QPainter.Antialiasing, True)\n        painter.setRenderHint(QPainter.SmoothPixmapTransform, True)\n\n        # 变换\n        transform = QTransform()\n        # 把圆心设置为矩形中心\n        transform.translate(self.width() / 2, self.height() / 2)\n\n        if self._angle >= -90 and self._angle <= 90:\n            # 当翻转角度在90范围内显示第一张图,且从大图缩放到小图的过程\n            painter.save()\n            # 设置翻转角度\n            transform.rotate(self._angle, Qt.YAxis)\n            painter.setTransform(transform)\n            # 缩放图片高度\n            width = self.image1.width() / 2\n            height = int(self.image1.height() *\n                         (1 - abs(self._angle / self.Scale) / 100))\n            image = self.image1.scaled(\n                self.image1.width(), height,\n                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)\n            painter.drawPixmap(\n                QPointF(-width, -height / 2), image)\n            painter.restore()\n        else:\n            # 当翻转角度在90范围内显示第二张图,且从小图缩放到原图的过程\n            painter.save()\n            if self._angle > 0:\n                angle = 180 + self._angle\n            else:\n                angle = self._angle - 180\n            # 设置翻转角度, 注意这里角度有差异\n            transform.rotate(angle, Qt.YAxis)\n            painter.setTransform(transform)\n            # 缩放图片高度\n            width = self.image2.width() / 2\n            height = int(self.image2.height() *\n                         (1 - ((360 - abs(angle)) / self.Scale / 100)))\n            image = self.image2.scaled(\n                self.image2.width(), height,\n                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)\n            painter.drawPixmap(\n                QPointF(-width, -height / 2), image)\n            painter.restore()
\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/FlipWidgetAnimation.py

\n

# 效果图

\n

\"FlipWidgetAnimation\"

\n", + "tags": [ + "PyQt", + "动画", + "翻转" + ] + }, + { + "id": "https://pyqt5.com/shadowradius.html", + "url": "https://pyqt5.com/shadowradius.html", + "title": "PyQt5无边框圆角阴影", + "date_published": "2019-04-25T16:06:26.000Z", + "content_html": "

在做 PyQt 窗口开发中经常会遇到要做一些无边框不规则的窗口,可能还会带有阴影效果,这里演示做一个简单的无边框圆角的窗口,原理就在于背景窗口的透明和一层有色背景控件的叠加。

\n\n

# 原理说明

\n
    \n
  1. 黑色(方便说明)的 QDialog 或者 QWidget 作为全透明无边框窗口。
  2. \n
  3. 其中白色的 QWidget 才是主要显示圆角和阴影的窗口,用于承载其它控件的显示。
  4. \n
  5. 注意红色和紫色的方框内的层次。
  6. \n
  7. 另:如果要熟悉纯代码编写请看 FramelessDialog.py
  8. \n
\n

如图:

\n

\"FramelessDialog1\"

\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/Demo/FramelessDialog.py

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年4月25日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: FramelessWidget\n@description: 无边框圆角带阴影窗口 \n\"\"\"\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtWidgets import QDialog, QGraphicsDropShadowEffect\nfrom frameless import Ui_Dialog\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019'\n\n\nclass Window(QDialog, Ui_Dialog):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        self.mPos = None\n        self.setupUi(self)\n        self.closeButton.clicked.connect(self.close)\n        # 重点\n        # 无边框\n        self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)\n        # 背景透明(就是ui中黑色背景的那个控件)\n        self.setAttribute(Qt.WA_TranslucentBackground, True)\n\n        # 添加阴影\n        effect = QGraphicsDropShadowEffect(self)\n        effect.setBlurRadius(12)\n        effect.setOffset(0, 0)\n        effect.setColor(Qt.gray)\n        self.setGraphicsEffect(effect)\n\n    # 加上简单的移动功能\n\n    def mousePressEvent(self, event):\n        \"\"\"鼠标点击事件\"\"\"\n        if event.button() == Qt.LeftButton:\n            self.mPos = event.pos()\n        event.accept()\n\n    def mouseReleaseEvent(self, event):\n        '''鼠标弹起事件'''\n        self.mPos = None\n        event.accept()\n\n    def mouseMoveEvent(self, event):\n        if event.buttons() == Qt.LeftButton and self.mPos:\n            self.move(self.mapToGlobal(event.pos() - self.mPos))\n        event.accept()\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"FramelessDialog\"

\n

# 下载

\n

无边框圆角阴影.zip

\n", + "tags": [ + "PyQt", + "阴影", + "无边框", + "圆角" + ] + }, + { + "id": "https://pyqt5.com/pageswitching.html", + "url": "https://pyqt5.com/pageswitching.html", + "title": "PyQt5之图片轮播", + "date_published": "2018-11-24T13:45:06.000Z", + "content_html": "

之前看到了 QStackedWidget 做切换动画,让界面不那么生硬,于是参考了 http://qt.shoutwiki.com/wiki/Extending_QStackedWidget_for_sliding_page_animations_in_Qt 做了一个 QStackedWidget 的切换动画,然后利用 QStackedWidget 结合多个 QLabel 显示图片来做一个轮播效果。

\n

其实在写之前也在网上找了很多例子,参看过后发现大多例子都是利用到了 paintEvent 去绘制,这样其实还是比较麻烦,个人觉得更好的方式是使用 QPropertyAnimation 属性动画修改控件中 QLabel 图片控件的 pos 位置属性就可以达到移动效果了。

\n\n
    \n
  1. 比较核心的算法就是要计算当前页面和下一个页面的位置偏移量,比如:
  2. \n
\n
# 计算偏移量\noffsetX = self.frameRect().width()\noffsetY = self.frameRect().height()\nw_next.setGeometry(0, 0, offsetX, offsetY)\n\nif direction == self.BOTTOM2TOP:\n    offsetX = 0\n    offsetY = -offsetY\nelif direction == self.TOP2BOTTOM:\n    offsetX = 0\nelif direction == self.RIGHT2LEFT:\n    offsetX = -offsetX\n    offsetY = 0\nelif direction == self.LEFT2RIGHT:\n    offsetY = 0\n\n# 重新定位显示区域外部/旁边的下一个窗口小部件\npnext = w_next.pos()\npnow = w_now.pos()\nself._pnow = pnow\n\n# 移动到指定位置并显示\nw_next.move(pnext.x() - offsetX, pnext.y() - offsetY)\nw_next.show()\nw_next.raise_()
\n
    \n
  1. \n

    其次是对这两个页面增加关联 pos 属性的 QPropertyAnimation 动画,然后加入到并行动画组 QParallelAnimationGroup 中再启动即可。

    \n
  2. \n
  3. \n

    QStackedWidgetsetCurrentIndexsetCurrentWidget 这两个函数进行了覆盖重写达到及时手动调用这两个函数也会产生动画效果的目的。

    \n
  4. \n
\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/PageSwitching.py

\n

# 效果图

\n

\"PageSwitching\"

\n", + "tags": [ + "PyQt", + "动画", + "轮播" + ] + }, + { + "id": "https://pyqt5.com/jumpslider.html", + "url": "https://pyqt5.com/jumpslider.html", + "title": "PyQt5之QSlider滑动条点击定位", + "date_published": "2018-11-05T15:12:26.000Z", + "content_html": "

QSlider 在通常情况下支持鼠标点击可以任意拖动,或者鼠标点击则往鼠标点击的方向移动一小格,这种移动一小格通常情况下用起来很不方便,比如我要做一个播放器的播放进度条,肯定是点击某个位置就直接跳到该位置,为此需要对 QSlider 的鼠标事件 mousePressEvent 进行重写。

\n\n

# 实现方法

\n

一般的想法就是重写 mousePressEvent 后,得到鼠标点击的 x 和 y 点然后进行比例换算,再通过 setValue 来设置值,其实 QSliderstyle 里面是有一个 sliderValueFromPosition 方法来计算值的。直接调用这个方法即可。

\n
    \n
  1. 首先通过 QSlider.style().subControlRect 方法计算得到滑块的区域,当鼠标点击区域在此次时则交给系统自己处理(比如按住不放拖动)
  2. \n
  3. 通过 orientation 判断滑动条的方向(横竖)
  4. \n
  5. 通过 invertedAppearance 判断滑动条是否反向(左右、上下)
  6. \n
  7. 通过 QSlider.style().sliderValueFromPosition(最小值, 最大值, x或者y坐标, 宽度或者高度) 来计算得到值
  8. \n
  9. 最后通过 setValue 来设置值
  10. \n
\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/QSlider/ClickJumpSlider.py

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年11月5日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: JumpSlider\n@description: \n\"\"\"\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtWidgets import QSlider, QStyleOptionSlider, QStyle, QWidget,\\\n    QFormLayout, QLabel\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = \"Copyright (c) 2018 Irony\"\n__Version__ = \"Version 1.0\"\n\n\nclass JumpSlider(QSlider):\n\n    def mousePressEvent(self, event):\n        # 获取上面的拉动块位置\n        option = QStyleOptionSlider()\n        self.initStyleOption(option)\n        rect = self.style().subControlRect(\n            QStyle.CC_Slider, option, QStyle.SC_SliderHandle, self)\n        if rect.contains(event.pos()):\n            # 如果鼠标点击的位置在滑块上则交给Qt自行处理\n            super(JumpSlider, self).mousePressEvent(event)\n            return\n        if self.orientation() == Qt.Horizontal:\n            # 横向,要考虑invertedAppearance是否反向显示的问题\n            self.setValue(self.style().sliderValueFromPosition(\n                self.minimum(), self.maximum(),\n                event.x() if not self.invertedAppearance() else (self.width(\n                ) - event.x()), self.width()))\n        else:\n            # 纵向\n            self.setValue(self.style().sliderValueFromPosition(\n                self.minimum(), self.maximum(),\n                (self.height() - event.y()) if not self.invertedAppearance(\n                ) else event.y(), self.height()))\n\n\nclass TestWindow(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(TestWindow, self).__init__(*args, **kwargs)\n        layout = QFormLayout(self)\n\n        self.label1 = QLabel('0', self)\n        layout.addRow(self.label1, JumpSlider(\n            Qt.Horizontal, valueChanged=lambda v: self.label1.setText(str(v))))\n\n        # 横向-反向显示\n        self.label2 = QLabel('0', self)\n        layout.addRow(self.label2, JumpSlider(\n            Qt.Horizontal, invertedAppearance=True,\n            valueChanged=lambda v: self.label2.setText(str(v))))\n\n        self.label3 = QLabel('0', self)\n        layout.addRow(self.label3, JumpSlider(\n            Qt.Vertical, minimumHeight=200, valueChanged=lambda v: self.label3.setText(str(v))))\n\n        # 纵向反向显示\n        self.label4 = QLabel('0', self)\n        layout.addRow(self.label4, JumpSlider(\n            Qt.Vertical, invertedAppearance=True,\n            minimumHeight=200, valueChanged=lambda v: self.label4.setText(str(v))))\n\n\nif __name__ == '__main__':\n    import sys\n    import cgitb\n    sys.excepthook = cgitb.enable(1, None, 5, '')\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = TestWindow()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"ClickJumpSlider\"

\n", + "tags": [ + "PyQt", + "滑动条" + ] + }, + { + "id": "https://pyqt5.com/rlatticeeffect.html", + "url": "https://pyqt5.com/rlatticeeffect.html", + "title": "PyQt5仿网页鼠标移动点阵特效", + "date_published": "2018-10-29T08:49:10.000Z", + "content_html": "

Orz,前段时间有个 zz 需求,就是要做一个类似网页上很多个多点连线、鼠标移动跟随的那种炫酷特效,然后花了点时间在网上找了 js 做的,刚开始打算是嵌入 QWebView 来显示网页,后来研究了下 js 的算法代码,遂改用 QWidgetpaintEvent 直接绘制。

\n\n

# 大概思路

\n
    \n
  1. 先根据窗口大小随机创建一些点
  2. \n
  3. 遍历这些点并找到与之相关联的点
  4. \n
  5. 在动画过程中绘制圆点和画两点之间的连线
  6. \n
  7. 属性动画 QPropertyAnimation 改变颜色的透明度
  8. \n
\n

# 题外

\n
    \n
  1. 这里没有仔细去研究 js 里的算法优化,在浏览器里嗖嗖的就生成了,在 py 里好慢…
  2. \n
  3. 尽量在 py 里优化了循环操作,也简单的做了个 cython 加速也才提高了 1s ? 1 倍?..
  4. \n
  5. 不要只是为了好看用这玩意儿,和网页的效果一样,占 CPU !!! 没有任何意义
  6. \n
  7. 如果有更好的优化算法请告知,3Q
  8. \n
  9. pyd 是 python3.4 生成的,删掉 pyd 也能运行
  10. \n
\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/RlatticeEffect.py

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年11月22日\n@author: Irony\n@site: https://pyqt5.com, https://github.com/892768447\n@email: 892768447@qq.com\n@file: \n@description: \n\"\"\"\nfrom random import random\nfrom time import time\n\nfrom PyQt5.QtCore import QPropertyAnimation, QObject, pyqtProperty, QEasingCurve,\\\n    Qt, QRectF, pyqtSignal\nfrom PyQt5.QtGui import QColor, QPainterPath, QPainter\nfrom PyQt5.QtWidgets import QWidget\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2018 Irony'\n__Version__ = 1.0\n\n\ntry:\n    import pointtool  # @UnusedImport @UnresolvedImport\n    getDistance = pointtool.getDistance\n    findClose = pointtool.findClose\nexcept:\n    import math\n\n    def getDistance(p1, p2):\n        return math.pow(p1.x - p2.x, 2) + math.pow(p1.y - p2.y, 2)\n\n    def findClose(points):\n        plen = len(points)\n        for i in range(plen):\n            closest = [None, None, None, None, None]\n            p1 = points[i]\n            for j in range(plen):\n                p2 = points[j]\n                dte1 = getDistance(p1, p2)\n                if p1 != p2:\n                    placed = False\n                    for k in range(5):\n                        if not placed:\n                            if not closest[k]:\n                                closest[k] = p2\n                                placed = True\n                    for k in range(5):\n                        if not placed:\n                            if dte1 < getDistance(p1, closest[k]):\n                                closest[k] = p2\n                                placed = True\n            p1.closest = closest\n\n\nclass Target:\n\n    def __init__(self, x, y):\n        self.x = x\n        self.y = y\n\n\nclass Point(QObject):\n\n    valueChanged = pyqtSignal()\n\n    def __init__(self, x, ox, y, oy, *args, **kwargs):\n        super(Point, self).__init__(*args, **kwargs)\n        self.__x = x\n        self._x = x\n        self.originX = ox\n        self._y = y\n        self.__y = y\n        self.originY = oy\n        # 5个闭合点\n        self.closest = [0, 0, 0, 0, 0]\n        # 圆半径\n        self.radius = 2 + random() * 2\n        # 连线颜色\n        self.lineColor = QColor(156, 217, 249)\n        # 圆颜色\n        self.circleColor = QColor(156, 217, 249)\n\n    def initAnimation(self):\n        # 属性动画\n        if not hasattr(self, 'xanimation'):\n            self.xanimation = QPropertyAnimation(\n                self, b'x', self, valueChanged=self.valueChanged.emit,\n                easingCurve=QEasingCurve.InOutSine)\n            self.yanimation = QPropertyAnimation(\n                self, b'y', self, valueChanged=self.valueChanged.emit,\n                easingCurve=QEasingCurve.InOutSine,\n                finished=self.updateAnimation)\n            self.updateAnimation()\n\n    def updateAnimation(self):\n        self.xanimation.stop()\n        self.yanimation.stop()\n        duration = (1 + random()) * 1000\n        self.xanimation.setDuration(duration)\n        self.yanimation.setDuration(duration)\n        self.xanimation.setStartValue(self.__x)\n        self.xanimation.setEndValue(self.originX - 50 + random() * 100)\n        self.yanimation.setStartValue(self.__y)\n        self.yanimation.setEndValue(self.originY - 50 + random() * 100)\n        self.xanimation.start()\n        self.yanimation.start()\n\n    @pyqtProperty(float)\n    def x(self):\n        return self._x\n\n    @x.setter\n    def x(self, x):\n        self._x = x\n\n    @pyqtProperty(float)\n    def y(self):\n        return self._y\n\n    @y.setter\n    def y(self, y):\n        self._y = y\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        self.setMouseTracking(True)\n        self.resize(800, 600)\n        self.points = []\n        self.target = Target(self.width() / 2, self.height() / 2)\n        self.initPoints()\n\n    def paintEvent(self, event):\n        super(Window, self).paintEvent(event)\n        painter = QPainter()\n        painter.begin(self)\n        painter.setRenderHint(QPainter.Antialiasing)\n        painter.fillRect(self.rect(), Qt.black)\n        self.animate(painter)\n        painter.end()\n\n    def mouseMoveEvent(self, event):\n        super(Window, self).mouseMoveEvent(event)\n        # 鼠标移动时更新xy坐标\n        self.target.x = event.x()\n        self.target.y = event.y()\n        self.update()\n\n    def initPoints(self):\n        t = time()\n        self.points.clear()\n        # 创建点\n        stepX = self.width() / 20\n        stepY = self.height() / 20\n        for x in range(0, self.width(), int(stepX)):\n            for y in range(0, self.height(), int(stepY)):\n                ox = x + random() * stepX\n                oy = y + random() * stepY\n                point = Point(ox, ox, oy, oy)\n                point.valueChanged.connect(self.update)\n                self.points.append(point)\n        print(time() - t)\n\n        t = time()\n        # 每个点寻找5个闭合点\n        findClose(self.points)\n        print(time() - t)\n\n    def animate(self, painter):\n        for p in self.points:\n            # 检测点的范围\n            value = abs(getDistance(self.target, p))\n            if value < 4000:\n                # 其实就是修改颜色透明度\n                p.lineColor.setAlphaF(0.3)\n                p.circleColor.setAlphaF(0.6)\n            elif value < 20000:\n                p.lineColor.setAlphaF(0.1)\n                p.circleColor.setAlphaF(0.3)\n            elif value < 40000:\n                p.lineColor.setAlphaF(0.02)\n                p.circleColor.setAlphaF(0.1)\n            else:\n                p.lineColor.setAlphaF(0)\n                p.circleColor.setAlphaF(0)\n\n            # 画线条\n            if p.lineColor.alpha():\n                for pc in p.closest:\n                    if not pc:\n                        continue\n                    path = QPainterPath()\n                    path.moveTo(p.x, p.y)\n                    path.lineTo(pc.x, pc.y)\n                    painter.save()\n                    painter.setPen(p.lineColor)\n                    painter.drawPath(path)\n                    painter.restore()\n\n            # 画圆\n            painter.save()\n            painter.setPen(Qt.NoPen)\n            painter.setBrush(p.circleColor)\n            painter.drawRoundedRect(QRectF(\n                p.x - p.radius, p.y - p.radius, 2 * p.radius, 2 * p.radius), p.radius, p.radius)\n            painter.restore()\n\n            # 开启动画\n            p.initAnimation()\n\n\nif __name__ == '__main__':\n    import sys\n    import cgitb\n    sys.excepthook = cgitb.enable(1, None, 5, '')\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"RlatticeEffect\"

\n", + "tags": [ + "PyQt", + "动画", + "特效" + ] + }, + { + "id": "https://pyqt5.com/datawidgetmapper_625781186.html", + "url": "https://pyqt5.com/datawidgetmapper_625781186.html", + "title": "QDataWidgetMapper 数据库绑定 QLineEdit控件", + "date_published": "2018-10-29T08:17:59.000Z", + "content_html": "

qt 为操作数据库提供了一个 model+view 的模式,这样简单的出入库逻辑就不需要自己编写。

\n

QDataWidgetMapper 可以 将数据库的数据 映射到其他控件 。

\n

注意:表格里的数据修改 还没有提交到数据库,需要点击提交按钮才生效。

\n\n

https://github.com/PyQt5/PyQt/tree/master/Test/partner_625781186/16_sqlModel/01_mapper

\n

# 代码

\n
#-*- coding: utf-8 -*-\n\nfrom PyQt5 import  QtWidgets, QtGui, QtCore\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtWidgets import *\nfrom PyQt5.QtSql import *\n\nimport sys\n\nsys.path.append('./ui')\nfrom Ui_MainWindow import Ui_MainWindow\n\n\nclass MainWindow(QMainWindow, Ui_MainWindow):\n    def __init__(self, parent=None, *args):\n\n        super(MainWindow, self).__init__(parent,  *args)\n        self.setupUi(self)\n        self.resize(800,600)\n        \n        #===============================   db   ======================================#\n        # self.db = QSqlDatabase.addDatabase('QMYSQL')\n        # self.db.setHostName(\"127.0.0.1\")  # set address\n        # self.db.setUserName(\"root\")  # set user name\n        # self.db.setPassword('123456')  # set user pwd   \n        # self.db.setDatabaseName(\"database\")\n        \n        self.db = QSqlDatabase.addDatabase('QSQLITE')\n        self.db.setDatabaseName('./db/database.db')\n\n        #================================= codemodel =====================================#\n        # 实例化model\n        self.codeModel = QSqlRelationalTableModel()\n        # model设置表\n        self.initializeModel(self.codeModel, 'Mongo')\n        # 设置编辑策略\n        # self.codeModel.setEditStrategy(QSqlTableModel.OnFieldChange)\n        # !!! 这里要注意 , 只能用这个策略 , 才可以实现自动提交\n        self.codeModel.setEditStrategy(QSqlTableModel.OnManualSubmit)\n\n        self.codeView = self.createView(\"code_View\", self.codeModel)\n        self.verticalLayout.addWidget(self.codeView)  \n\n        #================================ initData ==================================#\n        # 数据映射\n        self.mapper = QDataWidgetMapper()\n        # 提交策略\n        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)\n        # 映射的模型源\n        self.mapper.setModel(self.codeModel)\n        self.mapper.addMapping(self.l1,0)\n        self.mapper.addMapping(self.l2,1)\n        self.mapper.addMapping(self.l3,2)\n        self.mapper.addMapping(self.l4,3)\n        self.mapper.addMapping(self.l5,4)\n\n        self.mapper.toFirst()\n        \n        #================================ pushButton ==================================#\n        self.sub_btn.clicked.connect(self.mapper.submit)\n        self.sub_btn.clicked.connect(self.codeModel.submitAll)\n        self.pre_btn.clicked.connect(self.mapper.toPrevious)\n        self.next_btn.clicked.connect(self.mapper.toNext)\n        \n    def initializeModel(self, model, tablename):\n        '''重关联。'''\n        model.setTable(tablename)\n#        model.setEditStrategy(QSqlTableModel.OnRowChange)\n        model.select()\n        \n    def createView(self, title, model):\n        '''创建TableView视图'''\n        view =  QTableView()\n        view.setModel(model)\n        view.setWindowTitle(title)\n        #列宽设置\n        view.horizontalHeader().setSectionResizeMode(3)\n        #行高设置\n        view.verticalHeader().setSectionResizeMode(1)\n        #充满列宽\n        view.horizontalHeader().setStretchLastSection(True) \n#        view.verticalHeader().setVisible(False)#隐藏行标题\n        #标题左对齐\n        view.horizontalHeader().setDefaultAlignment(Qt.AlignLeft)\n        #标题左对齐\n        view.verticalHeader().setDefaultAlignment(Qt.AlignLeft)\n        \n        return view  \n    \n\nif __name__ == \"__main__\":\n    import sys\n    \n    app = QApplication(sys.argv)\n    app.setStyle(QStyleFactory.create(\"Fusion\"))\n    ui = MainWindow()\n    ui.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"datawidgetmapper\"

\n", + "tags": [ + "PyQt", + "Model" + ] + }, + { + "id": "https://pyqt5.com/qtninepatch.html", + "url": "https://pyqt5.com/qtninepatch.html", + "title": "PyQt5显示.9格式的PNG图片", + "date_published": "2018-10-26T02:00:08.000Z", + "content_html": "

做过安卓开发的和使用过 QQ 的都知道 .9.png 这种图片格式,效果就如 QQ 的聊天气泡一样可以拉伸,这种格式的图片允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展;允许开发人员定义内容显示区,用于显示文字或其他内容。目前在 Github 上有两个 C++ 版本的,在这里我把它们都用 Python 实现了一遍。另外一个我也为 PyQt 提供了编译好的 pyd 文件。

\n\n

# C++ 版本

\n

在 Github 开源库中搜索到两个 C++ 版本的

\n
    \n
  1. 一个是 NinePatchQt
  2. \n
  3. 一个是 QtNinePatch
  4. \n
\n

# PyQt5 版本

\n

这里也分为两个版本,都是基于上面的 C++ 源码翻译改写过来的,具体的例子见项目里面的测试代码吧。

\n
    \n
  1. QtNinePatch 是参考第一个源码编写,用法是在 paintEvent 中调用
  2. \n
  3. QtNinePatch2 是参考第二个源码编写,用法是 pixmap = QtNinePatch.createPixmapFromNinePatchImage(self.image, self.width(), self.height()) 直接得到一个处理好的 QPixmap 对象来使用
  4. \n
\n

# 说明

\n
    \n
  1. 建议优先使用 pyd 版本的(后续提供 Python3.4 3.5 3.6 3.7 编译好的 32 为库文件),也可以自行编译,编译步骤见下文。
  2. \n
  3. 其次可以使用纯 python 版本 2 的(个人觉得方便调用)
  4. \n
  5. 最后再考虑纯 python 版本 1 的吧
  6. \n
  7. 以上为个人意见,两个 C++ 版本的写法不一样,但是核心算法应该是类似的。
  8. \n
\n

# 自行编译

\n
    \n
  1. 首先要安装好 Qt、PyQt5、编译安装对应的 sip、对应的 VC++ 编译工具
  2. \n
  3. 用 Qt Creator 打开 pro 文件进行编译
  4. \n
  5. 进入源码中的 sip 文件夹修改 configure.py 文件
  6. \n
\n
# 这里是你的VC版本和对应的Qt目录中的文件夹\nconfig.platform = "win32-msvc2010"\nqt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010'
\n
    \n
  1. 最后执行 python configure.py 来编译
  2. \n
\n

# 下载

\n

https://github.com/PyQt5/PyQt/tree/master/QLabel

\n

# 效果图

\n

\"NinePatchImage\"

\n", + "tags": [ + "PyQt", + "图片", + "气泡", + ".9png" + ] + }, + { + "id": "https://pyqt5.com/mselectmenu.html", + "url": "https://pyqt5.com/mselectmenu.html", + "title": "PyQt5菜单之多选功能", + "date_published": "2018-10-25T01:53:34.000Z", + "content_html": "

有时候会遇到这种需求:在界面某个位置弹出一个菜单,其中里面的菜单项可以多选(类似配置选项),此时用 QMenu 会遇到点击一个菜单项就会自动关闭,当然可以通过其他方式实现该功能,不过这里就采用 QMenu 通过特殊的方式来实现该需求。

\n\n

# 需求

\n

要实现的效果:

\n
    \n
  1. 菜单 1
  2. \n
  3. 菜单 2
  4. \n
  5. 菜单 3
  6. \n
  7. 菜单 4
  8. \n
\n

点击菜单 1、2、3 可以多选不关闭菜单

\n

点击菜单 4 可以勾选,并且关闭菜单

\n

# 原理

\n
    \n
  1. 设置菜单项可勾选:通过 QAction.setCheckable(True) 方法实现
  2. \n
  3. 设置菜单不可关闭:通过覆盖 QMenu 的鼠标释放 mouseReleaseEvent 方法(可直接替换或者通过 installEventFilter 安装事件过滤器实现)
  4. \n
  5. 在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有 QAction ,然后触发对应的 QAction
  6. \n
  7. 故在没有 QAction 的地方则直接交还给 QMenu 自行处理逻辑,在有 QAction 的地方可以根据自己的需求进行处理(如上所提)
  8. \n
\n

# 代码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年10月24日\n@author: Irony\n@site: https://github.com/892768447\n@email: 892768447@qq.com\n@file: 菜单多选不关闭\n@description: \n\"\"\"\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton, QMenu,\\\n    QAction\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = \"Copyright (c) 2018 Irony\"\n__Version__ = \"Version 1.0\"\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.labelInfo = QLabel(self)\n        self.button = QPushButton('带按钮的菜单', self)\n        layout.addWidget(self.labelInfo)\n        layout.addWidget(self.button)\n\n        # 添加菜单\n        self._initMenu()\n\n    def _initMenu(self):\n        # 创建菜单\n        self._menu = QMenu(self.button)\n        # 替换menu的鼠标释放事件达到选择性不关闭菜单\n        self._menu.mouseReleaseEvent = self._menu_mouseReleaseEvent\n        self._menu.addAction('菜单1', self._checkAction)\n        self._menu.addAction('菜单2', self._checkAction)\n        self._menu.addAction(\n            QAction('菜单3', self._menu, triggered=self._checkAction))\n        action = QAction('菜单4', self._menu, triggered=self._checkAction)\n        # 添加自定义的属性,判断该属性可以关闭菜单\n        action.setProperty('canHide', True)\n        self._menu.addAction(action)\n        for action in self._menu.actions():\n            # 循环设置可勾选\n            action.setCheckable(True)\n        self.button.setMenu(self._menu)\n\n    def _menu_mouseReleaseEvent(self, event):\n        action = self._menu.actionAt(event.pos())\n        if not action:\n            # 没有找到action就交给QMenu自己处理\n            return QMenu.mouseReleaseEvent(self._menu, event)\n        if action.property('canHide'):  # 如果有该属性则给菜单自己处理\n            return QMenu.mouseReleaseEvent(self._menu, event)\n        # 找到了QAction则只触发Action\n        action.activate(action.Trigger)\n\n    def _checkAction(self):\n        # 三个action都响应该函数\n        self.labelInfo.setText('\\n'.join(['{}\\t选中:{}'.format(\n            action.text(), action.isChecked()) for action in self._menu.actions()]))\n\n\nif __name__ == '__main__':\n    import sys\n    import cgitb\n    sys.excepthook = cgitb.enable(1, None, 5, 'text')\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.resize(400, 400)\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"MultiSelect\"

\n", + "tags": [ + "PyQt", + "菜单" + ] + }, + { + "id": "https://pyqt5.com/pyqt5asyncio.html", + "url": "https://pyqt5.com/pyqt5asyncio.html", + "title": "PyQt5结合Asyncio异步", + "date_published": "2018-10-24T06:32:26.000Z", + "content_html": "

今天尝试了下 quamash 框架,该框架是一个 PyQt 的异步事件循环封装库,使用 Python3+ 的 asyncio 这个异步库。在看了该项目的内容后发现只有一个简单的进度条例子,故尝试用其来下载网络图片并显示。

\n\n

# 安装依赖

\n
    \n
  1. pip install quamash
  2. \n
  3. pip install aiohttp
  4. \n
  5. Python3.5+ 和 PyQt5
  6. \n
\n

这里使用 aiohttp 是因为它基于 asyncio 封装的网络操作库,常见的 getpost 等方法,不过它只支持 Python3.5 及以上的版本,主要是它使用了 async def 这样的语法。

\n

# 说明

\n
    \n
  1. 在创建 QApplication 后随即设置替换事件循环 loop
  2. \n
\n
app = QApplication(sys.argv)\nloop = QEventLoop(app)\nasyncio.set_event_loop(loop)\nw = Window()
\n
    \n
  1. 通过 asyncio.ensure_future(func(), loop=loop) 来执行某个异步函数
  2. \n
\n

# 流程

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
WindowinitSession(初始化 session)
下载按钮doDownload(执行_doDownload 方法)
session.get(下载 json 数据进行解析)
添加到界面_doDownloadImage(对单张图片进行下载)
\n

# 源码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年10月24日\n@author: Irony\n@site: https://github.com/892768447\n@email: 892768447@qq.com\n@file: AsyncioUiClient\n@description: \n\"\"\"\nimport asyncio\n\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtGui import QPixmap, QMovie\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton,\\\n    QApplication, QListWidget, QListWidgetItem, QLabel, QMessageBox\nimport aiohttp\nfrom quamash import QEventLoop\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = \"Copyright (c) 2018 Irony\"\n__Version__ = \"Version 1.0\"\n\nUrl = 'https://www.doutula.com/api/search?keyword=%E6%9C%80%E6%96%B0%E8%A1%A8%E6%83%85&mime=0&page={}'\nHeaders = {\n    ':authority': 'www.doutula.com',\n    ':method': 'GET',\n    ':scheme': 'https',\n    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',\n    'accept-language': 'zh-CN,zh;q=0.9',\n    'cache-control': 'max-age=0',\n    'dnt': '1',\n    'upgrade-insecure-requests': '1',\n    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.2.2498.400'\n}\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.listWidget = QListWidget(self)\n        self.listWidget.setSpacing(2)  # item直接的间隔\n        # 隐藏横向滚动条\n        self.listWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)\n        # 让list 从左到右排列\n        self.listWidget.setFlow(self.listWidget.LeftToRight)\n        # 自动换行\n        self.listWidget.setWrapping(True)\n        self.listWidget.setResizeMode(self.listWidget.Adjust)\n\n        self.buttonMsg = QPushButton('弹出提示框', self, clicked=self.showMessage)\n        self.buttonDown = QPushButton('下载图片', self, clicked=self.doDownload)\n        layout.addWidget(self.listWidget)\n        layout.addWidget(self.buttonMsg)\n        layout.addWidget(self.buttonDown)\n        self.currentPage = 0\n        self.initSession()  # 其实没必要,session主要用在需要登录的网站。缓存cookie用\n\n    def initSession(self):\n        async def _initSession():\n            # 初始化session\n            self.session = aiohttp.ClientSession(loop=loop)\n            print(self.session)\n        asyncio.ensure_future(_initSession(), loop=loop)\n\n    async def _doDownloadImage(self, url):\n        # 下载图片并添加到界面\n        async with self.session.get(url) as resp:\n            data = await resp.read()\n            if not data:\n                print('下载失败: ', url)\n                return\n            path = os.path.join('tmp', os.path.basename(url))\n            with open(path, 'wb') as fp:\n                fp.write(data)\n            item = QListWidgetItem(url, self.listWidget)\n            image = QPixmap(path)\n            item.setSizeHint(image.size())\n            label = QLabel(self.listWidget)\n            label.setPixmap(image)\n            if path.endswith('.gif'):  # 可能是动态图\n                label.setMovie(QMovie(path))\n            self.listWidget.setItemWidget(item, label)\n            self.listWidget.scrollToBottom()\n\n    async def _doDownload(self):\n        # 下载工作\n        if self.currentPage == -1:\n            QMessageBox.information(self, '提示', '已经没有更多了')\n            return\n        self.currentPage += 1\n        url = Url.format(self.currentPage)\n        print('get url: ', url)\n        async with self.session.get(url, headers=Headers) as resp:\n            data = await resp.json()\n            if not data:\n                return\n            data = data.get('data', None)\n            if not data:\n                self.currentPage = -1\n                print('已经是最后一页了')\n                return\n            # 解析json并生成item添加到界面中\n            for entity in data.get('list', []):\n                url = entity.get('image_url', None)\n                if not url:\n                    continue\n                await self._doDownloadImage(url)  # 下载图片\n\n    def doDownload(self):\n        # 响应按钮点击调用\n        asyncio.ensure_future(self._doDownload(), loop=loop)\n\n    def showMessage(self):\n        # 显示对话框\n        app.aboutQt()\n\n    def closeEvent(self, event):\n        if not self.session.closed:\n            asyncio.ensure_future(self.session.close(), loop=loop)\n        super(Window, self).closeEvent(event)\n\n\nif __name__ == '__main__':\n    import sys\n    import cgitb\n    import os\n    os.makedirs('tmp', exist_ok=True)\n    sys.excepthook = cgitb.enable(1, None, 5, 'text')\n    app = QApplication(sys.argv)\n    loop = QEventLoop(app)\n    asyncio.set_event_loop(loop)\n    w = Window()\n    w.show()\n    with loop:\n        loop.run_forever()
\n

# 效果图

\n

\"pyqt5asyncio\"

\n", + "tags": [ + "PyQt", + "Asyncio", + "异步" + ] + }, + { + "id": "https://pyqt5.com/likehtmleffect.html", + "url": "https://pyqt5.com/likehtmleffect.html", + "title": "PyQt5仿网页图片鼠标移动特效", + "date_published": "2018-10-23T09:57:03.000Z", + "content_html": "

em,就是类似于那种游戏官网首页的图片,鼠标放上去后来回移动,图片的前景和背景错位移动。

\n\n

# 原理分析

\n
    \n
  1. 2 张一样大小的透明图片,1 张作为背景,一张作为前景(比如说人物)。
  2. \n
  3. 当鼠标往左移动时,前景人物跟着往左移动,背景往右移动
  4. \n
  5. 计算好偏移量(见代码中)
  6. \n
\n

https://github.com/PyQt5/PyQt/blob/master/QLabel/ImageSlipped.py

\n

# 关键代码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年10月18日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: ImageSlipped\n@description: \n\"\"\"\nfrom PyQt5.QtGui import QPixmap, QPainter\nfrom PyQt5.QtWidgets import QWidget\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = \"Copyright (c) 2018 Irony\"\n__Version__ = \"Version 1.0\"\n\n\nclass SlippedImgWidget(QWidget):\n\n    def __init__(self, bg, fg, *args, **kwargs):\n        super(SlippedImgWidget, self).__init__(*args, **kwargs)\n        # 开启鼠标跟踪\n        self.setMouseTracking(True)\n        # 背景\n        self.bgPixmap = QPixmap(bg)\n        # 前景\n        self.pePixmap = QPixmap(fg)\n        # 最小尺寸(背景右边和下方隐藏10个像素)\n        size = self.bgPixmap.size()\n        self.setMinimumSize(size.width() - 10, size.height() - 10)\n        self.setMaximumSize(size.width() - 10, size.height() - 10)\n        # 分成10份用于鼠标移动判断\n        self.stepX = size.width() / 10\n        self.stepY = size.height() / 10\n        # 偏移量\n        self._offsets = [-4, -4, -4, -4]  # 背景(-4,-4),前景(-4,-4)\n\n    def mouseMoveEvent(self, event):\n        super(SlippedImgWidget, self).mouseMoveEvent(event)\n        pos = event.pos()\n\n        # 偏移量\n        offsetX = 5 - int(pos.x() / self.stepX)\n        offsetY = 5 - int(pos.y() / self.stepY)\n        self._offsets[0] = offsetX\n        self._offsets[1] = offsetY\n        self._offsets[2] = offsetX\n        self._offsets[3] = offsetY\n        # 刷新\n        self.update()\n\n    def paintEvent(self, event):\n        super(SlippedImgWidget, self).paintEvent(event)\n        # 绘制图形\n        painter = QPainter(self)\n        painter.setRenderHint(QPainter.Antialiasing)\n        # 左上角偏移5个像素画背景图片\n        painter.drawPixmap(\n            -5 + self._offsets[0],\n            -5 + self._offsets[1], self.bgPixmap)\n        # 右下角偏移5个像素画前景图片\n        painter.drawPixmap(\n            self.width() - self.pePixmap.width() + 5 - self._offsets[2],\n            self.height() - self.pePixmap.height() + 5 - self._offsets[3],\n            self.pePixmap\n        )\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = SlippedImgWidget('images/bg.png', 'images/fg.png')\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"ImageSlipped\"

\n", + "tags": [ + "PyQt", + "特效" + ] + }, + { + "id": "https://pyqt5.com/followwindow.html", + "url": "https://pyqt5.com/followwindow.html", + "title": "PyQt5窗口跟随其它窗口", + "date_published": "2018-10-23T07:08:56.000Z", + "content_html": "

要实现 PyQt 窗口跟随其它外部的窗口,能想到两点办法,一个是 hook 系统事件得到目标窗口的位置和大小以及是否关闭等,二是通过循环检测窗口的位置来实现。

\n\n

# 基于 Windows 定时检测目标窗口

\n
    \n
  1. 利用 win32gui 模块获取目标窗口的句柄
  2. \n
  3. 通过句柄获取目标窗口的大小位置,并设置自己的位置
  4. \n
  5. 主要是检测时间,在 10 毫秒以下很流畅
  6. \n
  7. 窗口关闭是根据目标句柄无效来判断
  8. \n
\n

https://github.com/PyQt5/PyQt/blob/master/Demo/FollowWindow.py

\n

# 代码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年10月22日\n@author: Irony\n@site: https://github.com/892768447\n@email: 892768447@qq.com\n@file: FollowWindow\n@description: \n\"\"\"\nimport os\n\nfrom PyQt5.QtCore import QTimer\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton\nimport win32gui\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = \"Copyright (c) 2018 Irony\"\n__Version__ = \"Version 1.0\"\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        layout.addWidget(QPushButton('test', self))\n        self.tmpHwnd = None\n        # 启动定时器检测记事本的位置大小和是否关闭\n        self.checkTimer = QTimer(self, timeout=self.checkWindow)\n        self.checkTimer.start(10)  # 10毫秒比较流畅\n\n    def checkWindow(self):\n        # 查找\n        hwnd = win32gui.FindWindow('Notepad', None)\n        if self.tmpHwnd and not hwnd:\n            # 表示记事本关闭了\n            self.checkTimer.stop()\n            self.close()  # 关闭自己\n            return\n        if not hwnd:\n            return\n        self.tmpHwnd = hwnd\n        # 获取位置\n        rect = win32gui.GetWindowRect(hwnd)\n        print(rect)\n        self.move(rect[2], rect[1])\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    # 先检测是否已有记事本打开\n    hwnd = win32gui.FindWindow('Notepad', None)\n    print('hwnd', hwnd)\n    if not hwnd:\n        # 启动记事本\n        os.startfile('notepad')\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"FollowWindow\"

\n", + "tags": [ + "PyQt", + "窗口" + ] + }, + { + "id": "https://pyqt5.com/animateshadow.html", + "url": "https://pyqt5.com/animateshadow.html", + "title": "PyQt5动画边框阴影", + "date_published": "2018-09-25T15:38:12.000Z", + "content_html": "

为子控件增加动画阴影效果,结合 QGraphicsDropShadowEffectQPropertyAnimation 动态改变阴影半径达到效果,在旧版本的 Qt 中 QGraphicsDropShadowEffect 可能会有点问题(父控件会影响子控件)

\n\n

# 原理

\n

原理是利用 QGraphicsDropShadowEffect 添加边框阴影,然后使用动画不停改变阴影的模糊半径来达到效果,如图:

\n

\"ShadowEffect\"

\n

# 简单说明

\n
    \n
  1. 继承 QGraphicsDropShadowEffect 增加动态属性 radius
  2. \n
  3. 通过 setGraphicsEffect 方法设置控件的边框阴影
  4. \n
  5. 通过 QPropertyAnimation 属性动画不断改变 radius 的值并调用 setBlurRadius 更新半径值
  6. \n
\n

https://github.com/PyQt5/PyQt/blob/master/QGraphicsDropShadowEffect/ShadowEffect.py

\n

# 自定义类

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年9月25日\n@author: Irony\n@site: https://pyqt5.com, https://github.com/892768447\n@email: 892768447@qq.com\n@file: AnimationShadowEffect\n@description: 边框动画阴影动画\n\"\"\"\nfrom PyQt5.QtCore import QPropertyAnimation, pyqtProperty\nfrom PyQt5.QtWidgets import QGraphicsDropShadowEffect\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2018 Irony'\n__Version__ = 1.0\n\n\nclass AnimationShadowEffect(QGraphicsDropShadowEffect):\n\n    def __init__(self, color, *args, **kwargs):\n        super(AnimationShadowEffect, self).__init__(*args, **kwargs)\n        self.setColor(color)\n        self.setOffset(0, 0)\n        self.setBlurRadius(0)\n        self._radius = 0\n        self.animation = QPropertyAnimation(self)\n        self.animation.setTargetObject(self)\n        self.animation.setDuration(2000)  # 一次循环时间\n        self.animation.setLoopCount(-1)  # 永久循环\n        self.animation.setPropertyName(b'radius')\n        # 插入线行值\n        self.animation.setKeyValueAt(0, 1)\n        self.animation.setKeyValueAt(0.5, 30)\n        self.animation.setKeyValueAt(1, 1)\n\n    def start(self):\n        self.animation.start()\n\n    @pyqtProperty(int)\n    def radius(self):\n        return self._radius\n\n    @radius.setter\n    def radius(self, r):\n        self._radius = r\n        self.setBlurRadius(r)
\n

# 测试代码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2018年9月25日\n@author: Irony\n@site: https://pyqt5.com, https://github.com/892768447\n@email: 892768447@qq.com\n@file: Test\n@description: \n\"\"\"\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtGui import QPixmap\nfrom PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QPushButton, QLineEdit\n\nfrom AnimationShadowEffect import AnimationShadowEffect  # @UnresolvedImport\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2018 Irony'\n__Version__ = 1.0\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QHBoxLayout(self)\n\n        # 绿色边框\n        labelGreen = QLabel(self, pixmap=QPixmap('1.jpg').scaled(100, 100))\n        layout.addWidget(labelGreen)\n        aniGreen = AnimationShadowEffect(Qt.darkGreen, labelGreen)\n        labelGreen.setGraphicsEffect(aniGreen)\n        aniGreen.start()\n\n        # 红色边框,圆形图片\n        labelRed = QLabel(self)\n        labelRed.setMinimumSize(100, 100)\n        labelRed.setMaximumSize(100, 100)\n        labelRed.setStyleSheet('border-image: url(1.jpg);border-radius: 50px;')\n        layout.addWidget(labelRed)\n        aniRed = AnimationShadowEffect(Qt.red, labelGreen)\n        labelRed.setGraphicsEffect(aniRed)\n        aniRed.start()\n\n        # 蓝色边框按钮\n        button = QPushButton('按钮', self)\n        aniButton = AnimationShadowEffect(Qt.blue, button)\n        layout.addWidget(button)\n        button.setGraphicsEffect(aniButton)\n        aniButton.start()\n\n        # 青色边框输入框\n        lineedit = QLineEdit(self)\n        aniEdit = AnimationShadowEffect(Qt.cyan, lineedit)\n        layout.addWidget(lineedit)\n        lineedit.setGraphicsEffect(aniEdit)\n        aniEdit.start()\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
", + "tags": [ + "PyQt", + "动画", + "阴影" + ] + }, + { + "id": "https://pyqt5.com/circleimage.html", + "url": "https://pyqt5.com/circleimage.html", + "title": "PyQt5圆形图片", + "date_published": "2018-09-25T14:13:26.000Z", + "content_html": "

实现圆形图片的方法有很多,比如用遮罩(mask), 裁切等等。这里比较几种实现方式,选出个人认为最优的方案。

\n\n

https://github.com/PyQt5/PyQt/blob/master/QLabel/CircleImage.py

\n

# 采用 mask 方式

\n

具体参考 【Qt】QLabel 实现的圆形图像 - 米罗西 - 博客园

\n

# 画圆形遮盖(适合纯色背景)

\n

原理是在原图片上画一个 4 角有颜色,中间圆形镂空的图片。

\n

\"circleimage1\"

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n'''\nCreated on 2017年8月25日\n@author: Irony.\"[讽刺]\n@site: https://pyqt5.com, https://github.com/892768447\n@email: 892768447@qq.com\n@description: \n'''\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtGui import QPixmap, QPainter, QPainterPath\nfrom PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout\n\n\n__Author__ = \"By: Irony.\\\"[讽刺]\\nQQ: 892768447\\nEmail: 892768447@qq.com\"\n__Copyright__ = \"Copyright (c) 2017 Irony.\\\"[讽刺]\"\n__Version__ = \"Version 1.0\"\n\n\nclass Label(QLabel):\n\n    def __init__(self, *args, antialiasing=True, **kwargs):\n        super(Label, self).__init__(*args, **kwargs)\n        self.Antialiasing = antialiasing\n        self.setMaximumSize(200, 200)\n        self.setMinimumSize(200, 200)\n        self.radius = 100\n\n        #加载图片并缩放\n        self.image = QPixmap(\"head.jpg\").scaled(\n            200, 200, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)\n\n        painter = QPainter(self.image)\n        if self.Antialiasing:\n            painter.setRenderHint(QPainter.Antialiasing, True)\n            painter.setRenderHint(QPainter.HighQualityAntialiasing, True)\n            painter.setRenderHint(QPainter.SmoothPixmapTransform, True)\n\n        path = QPainterPath()\n        path.addRoundedRect(\n            0, 0, self.width(), self.height(), self.radius, self.radius)\n        path.addRect(0,0,self.width(),self.height())\n        painter.setPen(Qt.NoPen)\n        painter.setBrush(Qt.green)\n        painter.drawPath(path)\n        self.setPixmap(self.image)\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QHBoxLayout(self)\n        layout.addWidget(Label(self))\n        layout.addWidget(Label(self, antialiasing=False))\n        self.setStyleSheet(\"background: black;\")\n\nif __name__ == \"__main__\":\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 使用 QPainter 的 setCompositionMode

\n

具体参考 Qt 圆形头像制作工具 抗锯齿 可缩放编辑

\n
//result_avatar_size 是我们最后生成的图片的长宽,可以是QSize(200, 200)的正圆\ndestination_image = QImage(result_avatar_size, QImage::Format_ARGB32_Premultiplied);\n//在黑色的正方形中间画一个透明的圆,作为头像遮罩\nQPainter painter(&destination_image);\npainter.setRenderHint(QPainter::Antialiasing);\n//全涂黑\npainter.fillRect(destination_image.rect(), QBrush(Qt::black, Qt::SolidPattern));\npainter.setCompositionMode(QPainter::CompositionMode_SourceOut);\npainter.setPen(Qt::NoPen);\npainter.setBrush(QBrush(Qt::transparent, Qt::SolidPattern));\n//画透明区域\npainter.drawEllipse(destination_image.rect());
\n

# 使用 QPainter 的切割方法(推荐)

\n

利用 QPainter.setClipPath 方法切割一个圆形的 QPainterPath

\n

\"circleimage2\"

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n'''\nCreated on 2017年8月25日\n@author: Irony.\"[讽刺]\n@site: https://pyqt5.com, https://github.com/892768447\n@email: 892768447@qq.com\n@file: \n@description: \n'''\nfrom PyQt5.QtCore import Qt\nfrom PyQt5.QtGui import QPixmap, QPainter, QPainterPath, QPen\nfrom PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout\n\n\n__Author__ = \"By: Irony.\\\"[讽刺]\\nQQ: 892768447\\nEmail: 892768447@qq.com\"\n__Copyright__ = \"Copyright (c) 2017 Irony.\\\"[讽刺]\"\n__Version__ = \"Version 1.0\"\n\n\nclass Label(QLabel):\n\n    def __init__(self, *args, antialiasing=True, **kwargs):\n        super(Label, self).__init__(*args, **kwargs)\n        self.Antialiasing = antialiasing\n        self.setMaximumSize(200, 200)\n        self.setMinimumSize(200, 200)\n        self.radius = 100\n\n        #####################核心实现#########################\n        self.target = QPixmap(self.size())  # 大小和控件一样\n        self.target.fill(Qt.transparent)  # 填充背景为透明\n\n        p = QPixmap(\"head.jpg\").scaled(  # 加载图片并缩放和控件一样大\n            200, 200, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)\n\n        painter = QPainter(self.target)\n        if self.Antialiasing:\n            # 抗锯齿\n            painter.setRenderHint(QPainter.Antialiasing, True)\n            painter.setRenderHint(QPainter.HighQualityAntialiasing, True)\n            painter.setRenderHint(QPainter.SmoothPixmapTransform, True)\n\n#         painter.setPen(# 测试黑色圆圈\n#             QPen(Qt.black, 5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))\n        path = QPainterPath()\n        path.addRoundedRect(\n            0, 0, self.width(), self.height(), self.radius, self.radius)\n        #**** 切割为圆形 ****#\n        painter.setClipPath(path)\n#         painter.drawPath(path)  # 测试黑色圆圈\n\n        painter.drawPixmap(0, 0, p)\n        self.setPixmap(self.target)\n        #####################核心实现#########################\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QHBoxLayout(self)\n        layout.addWidget(Label(self))\n        layout.addWidget(Label(self, antialiasing=False))\n        self.setStyleSheet(\"background: black;\")\n\nif __name__ == \"__main__\":\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
", + "tags": [ + "PyQt", + "圆形", + "图片" + ] + } + ] +} \ No newline at end of file diff --git "a/category/\344\276\213\345\255\220/rss.xml" "b/category/\344\276\213\345\255\220/rss.xml" new file mode 100644 index 00000000..5a18bcfc --- /dev/null +++ "b/category/\344\276\213\345\255\220/rss.xml" @@ -0,0 +1,1758 @@ + + + + PyQt • Posts by "例子" category + https://pyqt5.com + Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6 + zh-CN + Wed, 22 May 2019 03:30:36 +0000 + Wed, 22 May 2019 03:30:36 +0000 + PyQt + 动画 + 阴影 + 信号 + Python + 截图 + 异常 + 圆形 + 图片 + 线程 + Model + FFmpeg + HLS + 翻转 + 窗口 + 滑动条 + 特效 + Mac + M1 + 菜单 + 轮播 + 进程 + pyqt hook key + Asyncio + 异步 + subprocess.Popen + 拦截print + pytest-qt + python 状态机 + 气泡 + .9png + QWebView + QWebEngineView + 浏览器 + debug + snoop + 无边框 + 圆角 + 边框 + Github + 编辑器 + PyQt5 PySide2 + Designer + 设计师 + virtualenvwrapper + virtualenv + + https://pyqt5.com/qtwebjs.html + QtWebkit和QWebEngineView与Javascript交互 + https://pyqt5.com/qtwebjs.html + PyQt + QWebView + QWebEngineView + 浏览器 + Wed, 22 May 2019 03:30:36 +0000 + + + + https://pyqt5.com/flipwidgetanimation.html + PyQt5窗口翻转动画 + https://pyqt5.com/flipwidgetanimation.html + PyQt + 动画 + 翻转 + Wed, 15 May 2019 14:48:00 +0000 + + + + https://pyqt5.com/shadowradius.html + PyQt5无边框圆角阴影 + https://pyqt5.com/shadowradius.html + PyQt + 阴影 + 无边框 + 圆角 + Thu, 25 Apr 2019 16:06:26 +0000 + + + + https://pyqt5.com/pageswitching.html + PyQt5之图片轮播 + https://pyqt5.com/pageswitching.html + PyQt + 动画 + 轮播 + Sat, 24 Nov 2018 13:45:06 +0000 + + + + https://pyqt5.com/jumpslider.html + PyQt5之QSlider滑动条点击定位 + https://pyqt5.com/jumpslider.html + PyQt + 滑动条 + Mon, 05 Nov 2018 15:12:26 +0000 + + + + https://pyqt5.com/rlatticeeffect.html + PyQt5仿网页鼠标移动点阵特效 + https://pyqt5.com/rlatticeeffect.html + PyQt + 动画 + 特效 + Mon, 29 Oct 2018 08:49:10 +0000 + + + + https://pyqt5.com/datawidgetmapper_625781186.html + QDataWidgetMapper 数据库绑定 QLineEdit控件 + https://pyqt5.com/datawidgetmapper_625781186.html + PyQt + Model + Mon, 29 Oct 2018 08:17:59 +0000 + + + + https://pyqt5.com/qtninepatch.html + PyQt5显示.9格式的PNG图片 + https://pyqt5.com/qtninepatch.html + PyQt + 图片 + 气泡 + .9png + Fri, 26 Oct 2018 02:00:08 +0000 + + + + https://pyqt5.com/mselectmenu.html + PyQt5菜单之多选功能 + https://pyqt5.com/mselectmenu.html + PyQt + 菜单 + Thu, 25 Oct 2018 01:53:34 +0000 + + + + https://pyqt5.com/pyqt5asyncio.html + PyQt5结合Asyncio异步 + https://pyqt5.com/pyqt5asyncio.html + PyQt + Asyncio + 异步 + Wed, 24 Oct 2018 06:32:26 +0000 + + + + https://pyqt5.com/likehtmleffect.html + PyQt5仿网页图片鼠标移动特效 + https://pyqt5.com/likehtmleffect.html + PyQt + 特效 + Tue, 23 Oct 2018 09:57:03 +0000 + + + + https://pyqt5.com/followwindow.html + PyQt5窗口跟随其它窗口 + https://pyqt5.com/followwindow.html + PyQt + 窗口 + Tue, 23 Oct 2018 07:08:56 +0000 + + + + https://pyqt5.com/animateshadow.html + PyQt5动画边框阴影 + https://pyqt5.com/animateshadow.html + PyQt + 动画 + 阴影 + Tue, 25 Sep 2018 15:38:12 +0000 + + + + https://pyqt5.com/circleimage.html + PyQt5圆形图片 + https://pyqt5.com/circleimage.html + PyQt + 圆形 + 图片 + Tue, 25 Sep 2018 14:13:26 +0000 + + + + diff --git "a/category/\346\225\231\347\250\213/feed.json" "b/category/\346\225\231\347\250\213/feed.json" new file mode 100644 index 00000000..529da55a --- /dev/null +++ "b/category/\346\225\231\347\250\213/feed.json" @@ -0,0 +1,108 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "PyQt • All posts by \"教程\" category", + "description": "Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6", + "home_page_url": "https://pyqt5.com", + "items": [ + { + "id": "https://pyqt5.com/pytest_qt_modal_625781186.html", + "url": "https://pyqt5.com/pytest_qt_modal_625781186.html", + "title": "pytest-qt 测试模态窗体.", + "date_published": "2024-04-30T01:46:52.392Z", + "content_html": "

步骤分别是 :

\n
    \n
  1. \n

    点击 开始扫描 弹出 选择路径窗口;

    \n
  2. \n
  3. \n

    勾选路基;

    \n
  4. \n
\n

3. 点击确定;

\n\n

大概想测一下这个界面 :

\n

\"image.png\"

\n

步骤分别是 :

\n
    \n
  1. \n

    点击 开始扫描 弹出 选择路径窗口;

    \n
  2. \n
  3. \n

    勾选路基;

    \n
  4. \n
\n

3. 点击确定;

\n

需要测试的函数 :

\n

\"image.png\"

\n

测试函数 :

\n

\"image.png\"

\n

可以发现断言失败 .

\n

\"image.png\"

\n

官方文档:测试模态窗体.

\n

https://pytest-qt.readthedocs.io/en/latest/note_dialogs.html

\n

用的是官方的 monkeypatch 方式 .

\n

大致意思就是替换 FileSelectPathDialog 类的 exec 函数.

\n", + "tags": [ + "pytest-qt" + ] + }, + { + "id": "https://pyqt5.com/bindsignals.html", + "url": "https://pyqt5.com/bindsignals.html", + "title": "三种方式绑定信号槽", + "date_published": "2019-05-04T08:07:06.000Z", + "content_html": "

网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
\n这几种方式各有各的优点和缺点。

\n\n

# 方式一

\n

这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectNameQtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
\n比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:

\n
self.pushButton = QtWidgets.QPushButton(Form)\nself.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))\nself.pushButton.setObjectName(\"pushButton\")\n\n# 通过这里自动完成连接信号槽\nQtCore.QMetaObject.connectSlotsByName(Form)
\n

此时只需要继承该 UI 文件类然后增加如下方法:

\n
\n@pyqtSlot()\ndef on_pushButton_clicked(self):\n    print('button clicked')
\n

这里解释一下, @pyqtSlot() 装饰器把函数 on_pushButton_clicked 包装为一个槽函数,
\n而 QtCore.QMetaObject.connectSlotsByName(Form) 这句代码的意思就是自动去寻找满足的槽函数

\n

注意:这里有个规范(on_xxxx_clicked),这里必须要满足 on_控件的objectName_控件的信号 这样下划线连接起来的函数名才能被识别,
\n比如按钮的点击: on_pushButton_clicked 、勾选框的选中: on_checkbox_toggled(self, checked)

\n

# 方式二

\n

这种方式则直接通过代码里调用控件的信号的 connect 方法来进行绑定,比如:

\n
# 按钮点击函数\ndef doClicked(self):\n    print(self.sender(), 'clicked')\n\n# 绑定点击信号\nself.pushButton.clicked.connect(self.doClicked)
\n

注意: connect 的是函数名字self.sender() 这句代码是获取信号发送者(比如这里就是得到这个按钮对象),
\n用处在于有时候要循环创建一堆按钮

\n

# 方式三

\n

通过参数这种方式其实比较特殊,在 PyQt 中大部分存在,但是在 PySide 中则很少,原因是两者的封装方式不同。

\n

同时该方式用于在纯代码中比较常见,而且需要对该控件有那些信号可以用要很熟习,比如:

\n
\n# 按钮点击函数\ndef doClicked(self):\n    print(self.sender(), 'clicked')\n\npushButton = QPushButton('按钮', self, clicked=self.doClicked, minimumHeight=40)
\n

这里可以通过参数(信号名字) = 函数来绑定信号

\n

同时也可以设置其它参数,比如
\n button.setMinimumHeight(40) 也可以像参数里那样设置 minimumHeight=40

\n", + "tags": [ + "PyQt", + "信号" + ] + }, + { + "id": "https://pyqt5.com/runnablesignal_625781186.html", + "url": "https://pyqt5.com/runnablesignal_625781186.html", + "title": "QRunnable线程池发信号", + "date_published": "2019-04-30T07:58:09.000Z", + "content_html": "

因为只有继承 QObject 的类才能有信号和自定义信号,而 QRunnable 并不是继承自 QObject ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。

\n\n

pools 是 QThreadPool 实例

\n

# 看图说话

\n
    \n
  1. \"runnablesignal1\"
  2. \n
  3. 定义一个全局信号类
    \n\"runnablesignal2\"
  4. \n
  5. 在 QRunnable 中发送
    \n\"runnablesignal3\"
  6. \n
\n", + "tags": [ + "PyQt", + "信号", + "线程" + ] + }, + { + "id": "https://pyqt5.com/viewpyindesigner_625781186.html", + "url": "https://pyqt5.com/viewpyindesigner_625781186.html", + "title": "如何和设计师中查看ui转换的py代码", + "date_published": "2019-04-30T05:11:09.000Z", + "content_html": "

通过 设计师  查看 ui 转换的 py 代码

\n

当初我刚学 pyqt 的时候,也有很多疑惑,用什么属性把控件加到布局,改了这个属性会发生什么,为什么这个会这样,那个会那样 。。。 。。。

\n

后来就看 ui 转成的 py 代码,注释一下,什么效果消失了,就是那个 api 引起的 。

\n\n

再来后发现了官方文档,查一查函数就行了 .

\n

但是有些 api 文档找起来麻烦,用设计师点几下就行了,然后把转换出来的代码拷贝一下就完事了.

\n

可是需要单独把 ui 转为 py 文件,之后再删除这个文件也是很烦的一件事 .

\n

好,话不多说,接下来手把手教你如何快速在 ui 中查看 py 代码 .

\n

官方也考虑过这种情况,所以 设计师中 是有这个功能的,但是 qt 的是没问题的,pyqt 的毕竟是绑定过来的,所以正常来说 你点击之后会弹出一个找不到应用程序的提示 .

\n

看到这个东西是不是很眼熟,我们用的命令 pyuic5 和这个东西应该是一样的 .

\n

\"viewpyindesigner1\"

\n

所以接下来,我们找找电脑上有没有这个东西

\n

\"viewpyindesigner2\"

\n

果然在 pyqt5-toos 文件夹下有这个东西,

\n

我们根据第一张图的提示,把这个东西拷贝到相应的目录 (如果没有那个 bin 文件夹,手动创建),

\n

\"viewpyindesigner3\"

\n

好了,大功告成!

\n", + "tags": [ + "PyQt", + "Designer", + "设计师" + ] + }, + { + "id": "https://pyqt5.com/showframe.html", + "url": "https://pyqt5.com/showframe.html", + "title": "PyQt5调整窗口显示边框", + "date_published": "2019-04-26T14:19:26.000Z", + "content_html": "

windows 某些场景下调整窗口大小或者移动后就会导致里面的内容重绘(速度慢,卡顿,闪烁),其实在以前 windows 在低配置设备为了减少这种频繁绘制的情况,默认会开启这种效果,不过目前设备越来越好了就关闭了该功能。具体是在控制面板中 -> 调整 Windows 的外观和性能 -> 去掉勾选 拖动时显示窗口内容。

\n\n

由于这个开关是全局状态的,而我们只需要在自己的窗口中实现该效果有两种方式。

\n
    \n
  1. 一种是自己绘制一个边框效果,放开鼠标时才操作真正的窗口。
  2. \n
  3. 二是替换窗口的处理过程函数 wndproc 处理 WM_NCLBUTTONDOWN 消息事件。
  4. \n
\n

今天讲第二种方法:

\n
    \n
  1. 需要了解 SystemParametersInfo  API 函数
  2. \n
  3. SPI_GETDRAGFULLWINDOWS :确定是否允许拖拉到最大窗口
  4. \n
  5. SPI_SETDRAGFULLWINDOWS :设置是否允许拖至最大窗口
  6. \n
\n

效果就是这样的:

\n

\"ShowFrameWhenDrag\"

\n

正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在移动的时候出现闪烁的现象。

\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/Demo/ShowFrameWhenDrag.py

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年4月23日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: ShowFrameWhenDrag\n@description: 调整窗口显示边框\n\"\"\"\nfrom ctypes import sizeof, windll, c_int, byref, c_long, c_void_p, c_ulong, c_longlong,\\\n    c_ulonglong, WINFUNCTYPE, c_uint\n\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\nif sizeof(c_long) == sizeof(c_void_p):\n    WPARAM = c_ulong\n    LPARAM = c_long\nelif sizeof(c_longlong) == sizeof(c_void_p):\n    WPARAM = c_ulonglong\n    LPARAM = c_longlong\n\nWM_NCLBUTTONDOWN = 0x00a1\nGWL_WNDPROC = -4\nSPI_GETDRAGFULLWINDOWS = 38\nSPI_SETDRAGFULLWINDOWS = 37\nWNDPROC = WINFUNCTYPE(c_long, c_void_p, c_uint, WPARAM, LPARAM)\n\ntry:\n    CallWindowProc = windll.user32.CallWindowProcW\n    SetWindowLong = windll.user32.SetWindowLongW\n    SystemParametersInfo = windll.user32.SystemParametersInfoW\nexcept:\n    CallWindowProc = windll.user32.CallWindowProcA\n    SetWindowLong = windll.user32.SetWindowLongA\n    SystemParametersInfo = windll.user32.SystemParametersInfoA\n\n\ndef GetDragFullwindows():\n    rv = c_int()\n    SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, byref(rv), 0)\n    return rv.value\n\n\ndef SetDragFullwindows(value):\n    SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, value, 0, 0)\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        layout.addWidget(QLabel('拖动或者调整窗口试试看'))\n\n        # 重点替换窗口处理过程\n        self._newwndproc = WNDPROC(self._wndproc)\n        self._oldwndproc = SetWindowLong(\n            int(self.winId()), GWL_WNDPROC, self._newwndproc)\n\n    def _wndproc(self, hwnd, msg, wparam, lparam):\n        if msg == WM_NCLBUTTONDOWN:\n            # 获取系统本身是否已经开启\n            isDragFullWindow = GetDragFullwindows()\n            if isDragFullWindow != 0:\n                # 开启虚线框\n                SetDragFullwindows(0)\n                # 系统本身处理\n                ret = CallWindowProc(\n                    self._oldwndproc, hwnd, msg, wparam, lparam)\n                # 关闭虚线框\n                SetDragFullwindows(1)\n                return ret\n        return CallWindowProc(self._oldwndproc, hwnd, msg, wparam, lparam)\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 片尾

\n

替换窗口过程可以处理很多系统窗口的处理过程,更多需要读者自行去发现。

\n", + "tags": [ + "PyQt", + "边框" + ] + }, + { + "id": "https://pyqt5.com/issignalconnected.html", + "url": "https://pyqt5.com/issignalconnected.html", + "title": "PyQt5判断信号是否连接", + "date_published": "2019-04-26T14:06:26.000Z", + "content_html": "

PyQt 中某些情况下需要取消原来的信号连接,此时需要使用 disconnect 方法,但是在逻辑不严谨的情况下可能会导致多次调用 disconnect 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过  isSignalConnected  来判断信号是否连接。

\n\n

在 QOjbect 文档中这样写到:

\n
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);\nif (isSignalConnected(valueChangedSignal)) {\n    QByteArray data;\n    data = get_the_value();       // expensive operation\n    emit valueChanged(data);\n}
\n

通过直接传入信号就行了,但是这在 PyQt 中不可行。需要这么做

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年2月24日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: IsSignalConnected\n@description: 判断信号是否连接\n\"\"\"\n\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QTextBrowser\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.button1 = QPushButton('已连接', self, clicked=self.doTest)\n        self.button2 = QPushButton('未连接', self)\n        self.retView = QTextBrowser(self)\n        layout.addWidget(self.button1)\n        layout.addWidget(self.button2)\n        layout.addWidget(self.retView)\n\n    def doTest(self):\n        self.retView.append(\"\"\"\n        # button1 clicked 是否连接: %s\n        # button2 clicked 是否连接: %s\n        \"\"\" % (\n            self.isSignalConnected(self.button1, 'clicked()'),\n            self.isSignalConnected(self.button2, 'clicked()')\n        ))\n\n    def isSignalConnected(self, obj, name):\n        \"\"\"判断信号是否连接\n        :param obj:        对象\n        :param name:       信号名,如 clicked()\n        \"\"\"\n        index = obj.metaObject().indexOfMethod(name)\n        if index > -1:\n            method = obj.metaObject().method(index)\n            if method:\n                return obj.isSignalConnected(method)\n        return False\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"IsSignalConnected\"

\n", + "tags": [ + "PyQt", + "信号" + ] + }, + { + "id": "https://pyqt5.com/pyqtclientmac.html", + "url": "https://pyqt5.com/pyqtclientmac.html", + "title": "在Mac上以正确的姿势使用PyQtClient看Demo", + "date_published": "2019-04-02T09:18:43.000Z", + "content_html": "

由于 PyQtClient 只提供了 Windows 的版本,这里记录下编译后在 Mac 上运行。

\n\n

# 下载项目

\n

安装 git 略。没有的东西可以都先去试试 brew install xxx。没安装 homebrew 的建议使用搜索引擎

\n

git clone https://github.com/PyQt5/PyQtClient.git

\n

# 配置环境

\n
    \n
  1. 打开 IDE 配置 python 环境,使用 anaconda 比较方便
  2. \n
  3. 推荐用 pycharm,我是习惯了用 idea。anaconda 安装可以去官网下载。
  4. \n
  5. 环境原因,选择新建一个 python 3.6 p.s. 我取的环境名字就是 3.6 所以后面的 3.6 其实是这个原因
  6. \n
\n

# conda 源

\n

最好是加环境变量,不加也可以,就是以后用到的都需要指定路径,不太常用,我就没加

\n
~/anaconda3/bin/conda config --add channels conda-forge\n~/anaconda3/bin/conda config --add channels defaults\n~/anaconda3/bin/conda config --add channels r\n~/anaconda3/bin/conda config --add channels bioconda\n~/anaconda3/bin/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 
\n

# pip 源

\n
mkdir ~/.pip && vim ~/.pip/pip.conf
\n
[global]\nindex-url = http://mirrors.aliyun.com/pypi/simple/\n[install]\ntrusted-host = mirrors.aliyun.com
\n

# 安装编译依赖

\n
~/.conda/envs/3.6/bin/pip install -r PyQtClient/requirements.txt
\n

运行提示没有 webkit,开始手动编译

\n
    \n
  1. wget http://download.qt.io/archive/qt/5.9/5.9.0/qt-opensource-mac-x64-5.9.0.dmg
  2. \n
  3. wget https://github.com/annulen/webkit/releases/download/qtwebkit-5.212.0-alpha2/qtwebkit-5.212.0_alpha2-qt59-darwin-x64.tar.xz
  4. \n
  5. wget https://www.riverbankcomputing.com/static/Downloads/PyQt5/5.10.1/PyQt5_gpl-5.10.1.zip
  6. \n
  7. wget https://www.riverbankcomputing.com/static/Downloads/sip/4.19.8/sip-4.19.8.tar.gz
  8. \n
  9. 编译 sip: ~/.conda/envs/3.6/bin/python configure.py --platform macx-g++ && make && sudo make install
  10. \n
  11. 编译 Webkit.so 没有 qmake 和 sip 的环境变量, 所以后面都是手动指定的
  12. \n
\n
~/.conda/envs/3.6/bin/python configure.py --confirm-license --no-designer-plugin --no-qml-plugin --disable=dbus --disable=QAxContainer --disable=QtAndroidExtras --disable=QtBluetooth --disable=QtDBus --disable=QtDesigner --disable=Enginio --disable=QtLocation --disable=QtMacExtras --disable=QtMultimedia --disable=QtMultimediaWidgets --disable=QtNfc --disable=QtSerialPort --disable=QtSql --disable=QtSvg --disable=QtTest --disable=QtWinExtras --disable=QtX11Extras --disable=QtXml --disable=QtXmlPatterns --disable=pylupdate --disable=pyrcc --qmake=~/Qt5.9.0/5.9/clang_64/bin/qmake --sip=~/.conda/3.6/bin/sip && make && sudo make install
\n

# 插曲

\n
    \n
  1. libcurl 版本要求 10.0,而我的是 9.0,原因是前面我自己摸索,乱装依赖,所以遇到了
  2. \n
\n
~/anaconda3/bin/conda install -n 3.6 -c conda-forge libcurl
\n
    \n
  1. 结果这个 libcurl 10.0.0 是装上了,可是 pygit2 版本不对了,conda 给升级了,PyQtClient 里 requirements.txt 要求这个包的版本(pygit2==0.27.2)几乎决定了其他的环境版本。后来还是老实的用 conda 去装了。这个连 python 版本什么的都会跟着变的。最后降级的结果是 python 3.6.7
  2. \n
\n
~/anaconda3/bin/conda install -n 3.6 -c conda-forge libgit2==0.27.2
\n

至此总算是启动正常了。

\n", + "tags": [ + "PyQt" + ] + }, + { + "id": "https://pyqt5.com/calljava.html", + "url": "https://pyqt5.com/calljava.html", + "title": "Python调用Java对Excel截图", + "date_published": "2019-03-12T13:15:06.000Z", + "content_html": "

有的时候会遇到一些奇葩的需求,就是用 Excel 做报表,但是需要对里面的数据进行填充并生成报表图片,发送出去。这里记录用 python 调用 jar 包对 excel 文件进行公式计算和截图,数据填充可以用 xlrd 或者 openpyxl

\n\n

利用 jpype 模块初始化 java 虚拟机加载 jar 包然后执行其中的功能。

\n

# 代码

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年3月12日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: CallJava\n@description: \n\"\"\"\nimport os\n\nimport jpype\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019'\n\n\ndef convertToImage():\n    Workbook = jpype.JClass('com.aspose.cells.Workbook')\n    ImageFormat = jpype.JClass('com.aspose.cells.ImageFormat')\n    ImageOrPrintOptions = jpype.JClass(\n        'com.aspose.cells.ImageOrPrintOptions')\n    SheetRender = jpype.JClass('com.aspose.cells.SheetRender')\n\n    book = Workbook(os.path.abspath('data/test.xlsx').replace('\\\\', '/'))\n    # 保存为html\n    book.save('data/index.html', 12)\n    # 保存为pdf\n    book.save('data/test.pdf')\n\n    # 截图\n    imgOptions = ImageOrPrintOptions()\n    # imgOptions.setQuality(100)\n    imgOptions.setOnePagePerSheet(True)\n\n    # 输出图片格式\n#     imgOptions.setImageFormat(ImageFormat.getJpeg())\n    imgOptions.setImageFormat(ImageFormat.getPng())\n\n    # 计算\n    CalculationOptions = jpype.JClass(\n        'com.aspose.cells.CalculationOptions')\n    opt = CalculationOptions()\n    # 对Sheet1中的公式进行计算\n    sheet = book.getWorksheets().get('Sheet1')\n    sheet.calculateFormula(opt, True)\n\n    # 设置区域\n    pageSetup = sheet.getPageSetup()\n    # 去掉边距\n    pageSetup.setBottomMargin(0.)\n    pageSetup.setLeftMargin(0.)\n    pageSetup.setRightMargin(0.)\n    pageSetup.setTopMargin(0.)\n    # 设置要截图的区域(对角线)\n    pageSetup.setPrintArea('A0:C2')\n    # Create a SheetRender object for the target sheet\n    sr = SheetRender(sheet, imgOptions)\n    for page in range(sr.getPageCount()):\n        # Generate an image for the worksheet\n        sr.toImage(\n            page, os.path.join('data', '%d.png' % (page + 1)))\n\n\ndef test():\n    # emm这里不知道什么用绝对路径就报错\n    libs = '{};{}'.format(\n        'libs/bcprov-jdk16-146.jar',\n        'libs/aspose-cells-19.2.jar'\n    )\n    command = (jpype.getDefaultJVMPath(),\n                   '-ea', '-Xmn128m', '-Xms512M', '-Xmx512M',\n                   '-Djava.class.path={0}'.format(libs))\n    print(command)\n    jpype.startJVM(jpype.getDefaultJVMPath(),\n                   '-ea', '-Xmn128m', '-Xms512M', '-Xmx512M',\n                   '-Djava.class.path={0}'.format(libs)\n                   )\n    # 解决多线程问题\n    jpype.attachThreadToJVM()\n    # 对excel截图\n    convertToImage()\n    # 关闭虚拟机\n    jpype.shutdownJVM()\n    print('截图完成')\n\n\nif __name__ == '__main__':\n    test()
\n

# 附件

\n

调用 java 生成报表.7z

\n

解压后进入 whls 文件夹安装对应版本的 jpype 包

\n

# 效果图

\n

\"calljava\"

\n", + "tags": [ + "Python", + "截图" + ] + }, + { + "id": "https://pyqt5.com/webviewnew.html", + "url": "https://pyqt5.com/webviewnew.html", + "title": "PyQt5编译QWebView与QWebEngineView共存", + "date_published": "2019-01-12T11:28:06.000Z", + "content_html": "

在 PyQt5.5 过后移除了 QWebView 控件,改用 QWebEngineView ,但是这个刚开始用起来不是很方便,最近在整理一些例子的时候需要同时使用 QWebViewQWebEngineView ,故希望把 QWebView 重新加入到后面的 PyQt5 版本中,查看 PyQt5.10.1 的源码发现里面其实是有 QWebView 的,只是因为 Qt5.10.1 中没有编译好的 dll 等导致无法编译。

\n\n

# 准备工作

\n
    \n
  1. 安装 VS2015
  2. \n
  3. 安装 Qt5.10.1
  4. \n
  5. 前往 https://github.com/annulen/webkit/releases 下载对应的文件,比如:qtwebkit-5.212.0_alpha2-qt59-msvc2015-x86.zip
  6. \n
  7. 下载 PyQt5.10.1 源码
  8. \n
  9. 下载对应版本的 sip 源码
  10. \n
\n

# 编译

\n
    \n
  1. 设置环境变量 set PATH=D:\\soft\\Qt\\Qt5.10.1\\5.10.1\\msvc2015\\bin;%PATH%
  2. \n
  3. 首先进入 vs2015 命令行编译 sip 并安装, python configure.py && nmake && nmake install
  4. \n
  5. 进入 PyQt5.10.1 源码编译安装即可
  6. \n
  7. 如果要减少 PyQt5.10.1 的编译可以试试以下代码
  8. \n
\n
D:\\soft\\Python35\\python configure.py --confirm-license --no-designer-plugin --no-qml-plugin --disable=dbus --disable=QAxContainer --disable=QtAndroidExtras --disable=QtBluetooth --disable=QtDBus --disable=QtDesigner --disable=Enginio --disable=QtLocation --disable=QtMacExtras --disable=QtMultimedia --disable=QtMultimediaWidgets --disable=QtNfc --disable=QtSerialPort --disable=QtSql --disable=QtSvg --disable=QtTest --disable=QtWinExtras --disable=QtX11Extras --disable=QtXml --disable=QtXmlPatterns --disable=pylupdate --disable=pyrcc
", + "tags": [ + "PyQt", + "QWebView", + "浏览器" + ] + } + ] +} \ No newline at end of file diff --git "a/category/\346\225\231\347\250\213/rss.xml" "b/category/\346\225\231\347\250\213/rss.xml" new file mode 100644 index 00000000..fa80ed8c --- /dev/null +++ "b/category/\346\225\231\347\250\213/rss.xml" @@ -0,0 +1,591 @@ + + + + PyQt • Posts by "教程" category + https://pyqt5.com + Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6 + zh-CN + Tue, 30 Apr 2024 01:46:52 +0000 + Tue, 30 Apr 2024 01:46:52 +0000 + PyQt + 动画 + 阴影 + 信号 + Python + 截图 + 异常 + 圆形 + 图片 + 线程 + Model + FFmpeg + HLS + 翻转 + 窗口 + 滑动条 + 特效 + Mac + M1 + 菜单 + 轮播 + 进程 + pyqt hook key + Asyncio + 异步 + subprocess.Popen + 拦截print + pytest-qt + python 状态机 + 气泡 + .9png + QWebView + QWebEngineView + 浏览器 + debug + snoop + 无边框 + 圆角 + 边框 + Github + 编辑器 + PyQt5 PySide2 + Designer + 设计师 + virtualenvwrapper + virtualenv + + https://pyqt5.com/pytest_qt_modal_625781186.html + pytest-qt 测试模态窗体. + https://pyqt5.com/pytest_qt_modal_625781186.html + pytest-qt + Tue, 30 Apr 2024 01:46:52 +0000 + + + + https://pyqt5.com/bindsignals.html + 三种方式绑定信号槽 + https://pyqt5.com/bindsignals.html + PyQt + 信号 + Sat, 04 May 2019 08:07:06 +0000 + + + + https://pyqt5.com/runnablesignal_625781186.html + QRunnable线程池发信号 + https://pyqt5.com/runnablesignal_625781186.html + PyQt + 信号 + 线程 + Tue, 30 Apr 2019 07:58:09 +0000 + + + + https://pyqt5.com/viewpyindesigner_625781186.html + 如何和设计师中查看ui转换的py代码 + https://pyqt5.com/viewpyindesigner_625781186.html + PyQt + Designer + 设计师 + Tue, 30 Apr 2019 05:11:09 +0000 + + + + https://pyqt5.com/showframe.html + PyQt5调整窗口显示边框 + https://pyqt5.com/showframe.html + PyQt + 边框 + Fri, 26 Apr 2019 14:19:26 +0000 + + + + https://pyqt5.com/issignalconnected.html + PyQt5判断信号是否连接 + https://pyqt5.com/issignalconnected.html + PyQt + 信号 + Fri, 26 Apr 2019 14:06:26 +0000 + + + + https://pyqt5.com/pyqtclientmac.html + 在Mac上以正确的姿势使用PyQtClient看Demo + https://pyqt5.com/pyqtclientmac.html + PyQt + Tue, 02 Apr 2019 09:18:43 +0000 + + + + https://pyqt5.com/calljava.html + Python调用Java对Excel截图 + https://pyqt5.com/calljava.html + Python + 截图 + Tue, 12 Mar 2019 13:15:06 +0000 + + + + https://pyqt5.com/webviewnew.html + PyQt5编译QWebView与QWebEngineView共存 + https://pyqt5.com/webviewnew.html + PyQt + QWebView + 浏览器 + Sat, 12 Jan 2019 11:28:06 +0000 + + + + diff --git "a/category/\347\254\224\350\256\260/feed.json" "b/category/\347\254\224\350\256\260/feed.json" new file mode 100644 index 00000000..f4e11a34 --- /dev/null +++ "b/category/\347\254\224\350\256\260/feed.json" @@ -0,0 +1,105 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "PyQt • All posts by \"笔记\" category", + "description": "Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6", + "home_page_url": "https://pyqt5.com", + "items": [ + { + "id": "https://pyqt5.com/macm1pyqt.html", + "url": "https://pyqt5.com/macm1pyqt.html", + "title": "如何在Mac M1上快速安装PyQt5", + "date_published": "2023-10-07T06:08:06.000Z", + "content_html": "

由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。
\nM1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。

\n\n

1. 安装 Python
\npython-3.9.13-macosx10.9.pkg

\n

2. 勾选自定义同时只勾选安装 pip

\n

\"step1.png\"

\n

\"step1.png\"

\n

3. 设置 pip 源

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install pqi\n/Library/Frameworks/Python.framework/Versions/3.9/bin/pqi use tuna
\n

4. 安装 PyQt5

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install PyQt5
\n

5. 测试

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
\n

\"step3.png\"

\n

📢📢📢

\n

也可以直接安装 Miniconda

\n

然后:conda install -c conda-forge pyqt

\n", + "tags": [ + "PyQt", + "Mac", + "M1" + ] + }, + { + "id": "https://pyqt5.com/studynotes.html", + "url": "https://pyqt5.com/studynotes.html", + "title": "PyQt学习心得", + "date_published": "2019-08-26T01:00:00.000Z", + "content_html": "

在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。

\n\n

# Python 基础

\n

在学习和使用 PyQt 之前需要熟练使用 Python,经过对 QQ 群里经常提问的问题的分析,发现大部分人对 Python 中的基础知识掌握不牢固导致很多基础问题,如果要想更好的使用 Python 以及它的扩展必需要进行系统的学习。这里列举一下常用的知识点。

\n
    \n
  1. 类         参考资料
  2. \n
  3. 类的继承
  4. \n
  5. 类的多继承
  6. \n
  7. 类方法重写     参考资料
  8. \n
  9. 类中的 super 函数  参考资料
  10. \n
  11. 函数调用 / 参数类型
  12. \n
  13. 对象调用 (参考第 1 点)
  14. \n
\n

必须熟练掌握上面的知识点后入门 PyQt 才比较容易,如果初学者对上面的知识点还不是很了解,本文不适合继续往下阅读。

\n

# 设计师

\n

Qt 设计师除了方便快速设计一些简单的界面外,其实笔者觉得更大的作用在于帮助用户熟悉各类控件、属性、信号等

\n
    \n
  1. 这里建议初学者不要急于求成,打开设计师新建一个 Widget 的窗口,比如
  2. \n
\n

\"desiger_create\"

\n
    \n
  1. 然后把左侧的所有控件挨个拖动到中间的窗口中,比如这里拖动一个 Push Button 按钮
  2. \n
\n

\"desiger_drag\"

\n
    \n
  1. 在设计师右下角的属性编辑器中列举了该控件的所有父类,意味着可以调用和重写父类的所有方法,建议初学者把这个属性编辑器的所有属性挨个调整看看效果,部分控件可能需要 Ctrl+R 预览界面才能看到,同时像 QListWidget,QTreeWidget,QTableWidget 等某些控件需要在控件上右键增加数据才可以
  2. \n
\n

\"desiger_property\"
\n\"desiger_property2\"

\n
    \n
  1. 两个控件之间简单的信号槽关联可以通过设计师快速的设置
  2. \n
\n

\"desiger_signal\"
\n\"desiger_signal2\"

\n
    \n
  1. 提高进阶的方法,当你需要手动写代码实现界面的时候,不妨把 UI 文件转出 PY 文件,看看是如何构造的(这里涉及到布局等知识见后文)
  2. \n
\n

# 布局

\n

Qt 界面提供了方便的 4 种基本布局,QVboxLayout,QHboxLayout,QFormLayout,QGridLayout,初学者需要数量掌握这 4 种布局外加 2 种拉伸器(占位挤压)

\n

首先需要知道 Qt 界面的中控件的层级顺序以及 parent,parent 的作用既作为子控件的父元素也可以自动管理 Qt 的对象(具体可以搜索下关于 Qt parent 的资料)

\n
    \n
  1. 在没有布局的情况下,在设计师中拖动摆放的控件是一层一层的叠加覆盖,此时每个添加的子控件的 parent 都是最外层的控件
  2. \n
\n

\"desiger_stack\"

\n
    \n
  1. 如果需要界面中的控件自动适应高度宽度,此时则需要使用 4 种布局来包裹里面的子控件,注意的是:布局不是控件不能设置高度宽度和样式等,是一个抽象的东西,就好比是一根橡皮筋包裹几个矩形的物品;布局也可以设置一些属性(在设计师属性编辑器中),比如设置两者直接的间距,设置距离上下左右的间距,设置比例等
  2. \n
\n

\"desiger_layout\"

\n
    \n
  1. 在没有布局或者有布局的时候。可以添加容器控件(QWidget,QFrame,QGroupBox,QScrollArea,QToolBox,QTabWidget,QStackedWidget,QMidArea,QDockWidget)这些容器可以放置子控件,从而循环嵌套。
  2. \n
\n

# 例子

\n

在 PyQt5.5 的时候自带了一个例子文件夹(后面的版本没有的话可以下载 PyQt5 源码,里面有个 examples 文件夹),想要熟练的掌握 PyQt 还需要从自带的例子中学习,必须要每个例子都运行一次然后看看这个例子实现了什么,这样才能记忆深刻。
\n同时很多开发者在 https://github.com/PyQt5/PyQt 分享了各类进阶例子,同时也欢迎大家共同完善该项目,提供更多更好的例子。另外也可以下载该项目的客户端 PyQtClient 软件,支持运行其中的例子

\n

建议在更深入的学习 PyQt 之前多看看一些例子。

\n

# 文档

\n

接下来要说的就是 Qt 的 api 文档,官网文档,这里其实不要害怕是英文就不想看,觉得看不懂了,其实官网的文档还是比较简洁的,而且函数名也比较直观就能知道意思。也可以用谷歌浏览器打开右键翻译,基本上都能看懂。笔者前期写过一篇如何查阅 Qt 文档的文档可以阅读学习一番。

\n

这里就拿 QWebEngineView 举一个例子,首先初学者在使用这个浏览器控件时候,会有诸多的问题比如:Cookie,拦截器等就不知道如何去调用函数来设置

\n
    \n
  1. 首先打开官网文档 https://doc.qt.io/qt-5/qwebengineview.html,可以看到只有少量的函数可以调用,寻找一番并没有发现和 Cookie 相关的东西,这个时候就需要把重点放在有特俗返回值的函数上,比如:
  2. \n
\n
QWebEngineHistory *\t          history() const\nQWebEnginePage *\t          page() const\nQWebEngineSettings *\t      settings() const
\n

这三个函数返回了一个类实例,就意味着可以调用其中的方法。

\n
    \n
  1. \n

    点击 page () 打开 https://doc.qt.io/qt-5/qwebenginepage.html,发现没有 cookie 相关的东西,只有 QWebEngineProfile *\tprofile () const 这个函数比较可疑。

    \n
  2. \n
  3. \n

    点击 **profile ()** 打开 https://doc.qt.io/qt-5/qwebengineprofile.html,在浏览器中搜索 cookie 发现这个类中包含大量和 cookie 相关的东西,比如:**QWebEngineCookieStore *\tcookieStore ()`** 从名字上可以猜测大概意思为 cookie 储存

    \n
  4. \n
  5. \n

    点击 **cookieStore ()** 打开 https://doc.qt.io/qt-5/qwebenginecookiestore.html,此时就会发现这个类里面包含了删除和设置 cookie 的方法。

    \n
  6. \n
  7. \n

    但是找到了这些方法后,面对初学者又一个问题来了,该如何去用?根据上面 4 点整理一下,把他们当做简单的 Python 对象,方法和操作方法和 class 一样的。

    \n
  8. \n
\n
self.webview = QWebEngineView()\n# 得到page\npage = self.webview.page()\n# 得到profile\nprofile = page.profile()\n# 得到cookieStore\ncookieStore = profile.cookieStore()\n# 清空cookie\ncookieStore.deleteAllCookies()\n\n# 用简短代码来表达就是\ncookieStore = self.webview.page().profile().cookieStore()\ncookieStore.deleteAllCookies()
\n

# 异常调试

\n

可能有时候由于粗心,或者调用了一些非法函数,参数错误等会导致程序出现一些异常,首先第一步复制最后一行的错误去百度或者谷歌搜索,大多时候能找到问题所在。其次如果搜索不到或者自己的异常可能是由于某个变量的值不对引起的,就需要在编辑器中打断点使用 DEBUG 模式调试变量值(如果不会可以采用麻烦一点的办法:用 print 打印出变量值)

\n

遇到问题后首先需要自己多调试排查问题,不要一遇到问题就去问,自己多尝试一个一个排查直到找到问题所在并解决,这也是一种提高自身能力的地方。

\n

# 检索资料

\n

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。信息检索是每个程序猿必备的能力之一,其好处在于可以更快更准确的在茫茫网络海洋中找到自己所需要的东西,这个过程需要长期不断积累和练习。

\n
    \n
  1. 中文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt 拖拽
  2. \n
  3. 英文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt Drag Drop
  4. \n
\n

# 片尾

\n

好了,笔者基本上的学习过程就整理如上,这并不是说每个人都适合这样的方法,但至少笔者是这样一步一步走过来的。当你养成了一个学习、发现和解决问题的好习惯时就会慢慢得心应手。

\n", + "tags": [ + "PyQt" + ] + }, + { + "id": "https://pyqt5.com/QPropertyAnimation.html", + "url": "https://pyqt5.com/QPropertyAnimation.html", + "title": "PyQt属性动画(QPropertyAnimation)", + "date_published": "2019-05-08T07:43:06.000Z", + "content_html": "

QPropertyAnimation 继承自 QVariantAnimation ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 QObject 的对象中定义的属性做修改,
\n简单来说就是基类是 QObject 且定义了属性变量,就可以用 QPropertyAnimation 来做属性动画。同时也可以通过 pyqtProperty 来增加自定义属性。

\n\n

首先,通过构造函数 QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None) 创建一个对象,其中

\n
    \n
  1. 第一个参数是动画作用的对象,也可以通过 setTargetObject 设置
  2. \n
  3. 第二个参数是属性名,在 py3 中类型是 bytes,也可以通过 setPropertyName 设置
  4. \n
\n

# 函数

\n

一些常见的设置函数

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
setPropertyName设置属性名
setTargetObject设置动画作用对象
setDuration设置动画持续时间(毫秒)
setStartValue设置开始值
setEndValue设置结束值
setEasingCurve设置动画曲线
setKeyValueAt插入线性值
setLoopCount设置循环次数(-1 为永久)
\n

# 示例

\n

比如这个例子:

\n
    \n
  1. 修改控件的 geometry 大小
  2. \n
  3. 修改自定义属性
  4. \n
  5. 修改进度条的 value 值
  6. \n
\n

\"QPropertyAnimation\"

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年5月8日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: \n@description: \n\"\"\"\nfrom PyQt5.QtCore import QPropertyAnimation, QRect, pyqtProperty, QEasingCurve\nfrom PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout,\\\n    QLabel, QProgressBar, QSpacerItem, QSizePolicy\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        self.resize(400, 400)\n        self._value = 0\n        self.button = QPushButton('属性动画测试', self)\n        self.button.clicked.connect(self.doStart)\n        self.button.setGeometry(0, 0, 80, 40)\n\n        self.buttonc = QPushButton('自定义属性 测试', self)\n        self.buttonc.clicked.connect(self.doStartCustom)\n\n        self.label = QLabel('', self)\n\n        self.progressbar = QProgressBar(self)\n        self.progressbar.setRange(0, 99)\n\n        layout = QVBoxLayout(self)\n        layout.addItem(QSpacerItem(\n            20, 60, QSizePolicy.Fixed, QSizePolicy.Fixed))\n        layout.addWidget(self.buttonc)\n        layout.addWidget(self.label)\n        layout.addWidget(self.progressbar)\n\n        # 进度条动画\n        self.progressStart()\n\n    # 此处是自定义属性,并通过动画修改后,设置QLabel的值\n    @pyqtProperty(int)\n    def value(self):\n        return self._value\n\n    @value.setter\n    def value(self, v):\n        self._value = v\n        self.label.setText('当前值:{}'.format(v))\n\n    def doStart(self):\n        # 第一个参数是要执行的对象\n        animation = QPropertyAnimation(self.button, b'geometry', self)\n        animation.setDuration(2000)  # 持续时间\n        # 缓和曲线风格,加了曲线动画会很大程度影响\n        animation.setEasingCurve(QEasingCurve.OutBounce)\n        animation.setStartValue(QRect(0, 0, 40, 40))\n        animation.setEndValue(QRect(250, 250, 80, 80))\n        animation.start(animation.DeleteWhenStopped)\n\n    def doStartCustom(self):\n        # 自定义属性动画\n        # 由于定义的属性是在继承的QWidget, 所以第一个参数是self\n        # 第二个参数就是 value\n        animation = QPropertyAnimation(self, b'value', self)\n        animation.setDuration(2000)  # 持续时间\n        animation.setStartValue(0)\n        animation.setEndValue(100)\n        animation.start(animation.DeleteWhenStopped)\n\n    def progressStart(self):\n        # 进度条动画\n        # 这里 value是QProgressBar自带的属性,具体可以看文档\n        # https://doc.qt.io/qt-5/qprogressbar.html#properties\n        animation = QPropertyAnimation(self.progressbar, b'value', self)\n        animation.setDuration(2000)  # 持续时间\n        animation.setLoopCount(-1)\n        # 这里采用插入线性值,第一个参数的范围是(0-1)\n        # 第二个参数的范围是进度(最小值-最大值)\n        animation.setKeyValueAt(0, self.progressbar.minimum())\n        animation.setKeyValueAt(0.1, 10)\n        animation.setKeyValueAt(0.2, 30)\n        animation.setKeyValueAt(0.5, 60)\n        animation.setKeyValueAt(0.7, 80)\n        animation.setKeyValueAt(1, self.progressbar.maximum())\n        animation.start(animation.DeleteWhenStopped)\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())\n
", + "tags": [ + "PyQt", + "动画" + ] + }, + { + "id": "https://pyqt5.com/viewapi.html", + "url": "https://pyqt5.com/viewapi.html", + "title": "如何查阅Qt文档", + "date_published": "2019-05-04T12:50:20.000Z", + "content_html": "

很多网友在问有没有 PyQt5 的文档之类的问题,在 PyQt4 的时候 PyQt 官网有了英文版的文档,随后有网友翻译成了中文。不过现在 PyQt5 官方的文档都指向了 C 的 Qt 文档,其实 C 的 Qt API 文档结构很清晰,翻阅很容易的,需要注意几点。

\n\n

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。

\n

拿 Qt C++ 文档来说,官网地址是:https://doc.qt.io/qt-5/qtwidgets-module.html 这里面记录了所有控件的详细函数文档。

\n

比如拿 输入框 QLineEdit 来说,怎么去查询它的用法和信号槽等资料?

\n

https://doc.qt.io/qt-5/qlineedit.html

\n

# 左侧目录

\n

在文档左侧目录中有如下几个:

\n

Properties - 控件里的属性(比如宽高等,通常需要当作函数调用)

\n

Public Slots - 这个是控件自己的槽函数(当作普通函数就行)

\n

Signals - 这个是输入框的包含的信号

\n

Public Functions、Reimplemented Public Functions、Static Public Members、Protected Functions、Reimplemented Protected Functions - 这几个都是函数列表

\n

\"howtoviewapi1\"

\n

# 类说明

\n

\"howtoviewapi2\"

\n

这里有两个注意点

\n
    \n
  1. 红色方框内的表示该控件(输入框)继承于 QWidget ,所以该控件(输入框)拥有父类的所有方法和信号,当当前文档找不到相关资料和函数时,可以去父类找找看。
  2. \n
  3. 紫色方框内表示列举所有的方法(包括父类)
  4. \n
\n

# 函数列表

\n

\"howtoviewapi3\"

\n

这里列举的就是该控件(输入框)的函数,同理点击上面的紫色方框是查看所有方法,一般这里主要用来查询你需要的功能函数,Qt 的函数名比较容易理解,比如:只读 ReadOnly,选择文字:setSelection。

\n

所以再查下这部分资料的时候建议在浏览器中 Ctrl + F 打开浏览器的搜索框,并输入英文关键词来检索你所需要的函数在哪里。

\n

\"howtoviewapi8\"

\n

# 槽函数

\n

\"howtoviewapi4\"

\n

这部分列举的是槽函数,其实在 PyQt 中槽函数可以当作普通的函数。普通的函数也可以作为槽函数,直接通过信号连接即可,注意方框所示,还有很多函数是在父类里面。

\n

# 信号

\n

\"howtoviewapi5\"

\n

这部分列举了该控件(输入框)所定义的信号,主要还是看名字,大多都能知道是做什么的,比如:

\n
    \n
  1. editingFinished - 编辑完成信号
  2. \n
  3. returnPressed - 回车键信号
  4. \n
  5. textChanged (const QString &text) - 内容改变信号
  6. \n
\n

这里还有个问题就是参数问题,一般 & 后面的 text 作为参数传递到槽函数中

\n

# 函数详细说明

\n

当不明确这个函数是做什么的,可以点击该函数跳转到下面的说明,比如回车键信号 returnPressed

\n

\"howtoviewapi6\"

\n

如图上所示,用翻译插件翻译,大部分就明白了,如下:

\n

\"howtoviewapi7\"

\n

# 关于如何搜索资料

\n

比如当你要搜索输入框内容改变事件,一般建议两种搜索,且搜索的时候用空格把关键词分开搜索,而且直接用控件名

\n
    \n
  1. 中文搜索引擎:QLineEdit 内容 改变
  2. \n
  3. 英文搜索引擎:QLineEdit text change
  4. \n
\n", + "tags": [ + "PyQt" + ] + }, + { + "id": "https://pyqt5.com/speedgithub.html", + "url": "https://pyqt5.com/speedgithub.html", + "title": "解决GitHub下载速度缓慢的问题", + "date_published": "2019-04-18T00:59:06.000Z", + "content_html": "

由于 Github 的下载走的是 AWS - 亚马逊的路线,,so slow,跟乌龟一样慢。。照着一些方法改了 hosts 文件,偶尔能提提速度。

\n\n

# Windows

\n

Hosts 文件的路径是:

\n

C:\\Windows\\System32\\drivers\\etc

\n

# Mac

\n

终端内输入:

\n

sudo vim /etc/hosts

\n

# 追加域名的 IP 地址

\n

利用 https://www.ipaddress.com/ 来获得以下两个 GitHub 域名的 IP 地址:

\n

(1) github.com

\n

(2) github.global.ssl.fastly.net

\n

打开网页后,利用输入框内分别查询两个域名

\n

将以上两段 IP 写入 Hosts 文件中:

\n
192.30.253.112               github.com\n151.101.185.194              github.global.ssl.fastly.net
\n

保存。

\n

刷新 DNS 缓存

\n

在终端或 CMD 中,执行以下命令:

\n

ipconfig /flushdns

\n", + "tags": [ + "Github" + ] + }, + { + "id": "https://pyqt5.com/ffmpeghls.html", + "url": "https://pyqt5.com/ffmpeghls.html", + "title": "FFmpeg合成加密HLS记录", + "date_published": "2019-01-12T11:28:06.000Z", + "content_html": "

记录在某个需求中要求截图并合成加密视频文件,这里采用 FFmpeg 的管道流来实现生成 HLS 加密文件。

\n\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年3月4日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: \n@description: \n\"\"\"\n\nfrom pathlib import Path\nfrom subprocess import Popen, PIPE\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\n\n# p = Popen([r'D:\\soft\\ffmpeg\\bin\\ffmpeg.exe', '-y',\n#            '-threads', '2',\n#            '-f', 'image2pipe',\n#            '-vcodec', 'mjpeg', '-r', '24', '-i', '-',\n#            '-vcodec', 'h264', '-r', '24',\n#            #            '-encryption_scheme', 'cenc-aes-ctr',\n#            #            '-encryption_key', '617D8A125A284DF48E3C6B1866348A3F',\n#            #            '-encryption_kid', 'B326F895B6A24CC5A4DC70995728059C',\n#            r'F:\\Workspace\\Test\\videos\\video.mp4'], stdin=PIPE)\n\np = Popen([r'D:\\soft\\ffmpeg\\bin\\ffmpeg.exe',\n           '-re',   # 按照实际帧率读取输入文件\n           '-y',        # 覆盖已存在文件\n           '-threads', '2',  # 线程数量\n           '-f', 'image2pipe',  # PIPE图片流\n           '-vcodec', 'mjpeg',  # 图片编码\n           '-r', '24',  # 帧率\n           '-i', '-',  # 指定输入流为PIPE\n           '-vcodec', 'h264',  # 输出编码\n           '-r', '24',  # 帧率\n           '-map', '0',\n#            '-crf','20',     # 降低质量\n           '-b', '720k',        # 码率\n           '-f', 'hls',\n           '-codec:v', 'libx264',\n           '-vbsf', 'h264_mp4toannexb',\n           # 指定加密密匙文件\n           '-hls_key_info_file', r'F:\\Workspace\\Test\\videokey.info',\n           '-hls_time', '20',\n           '-hls_list_size', '0',\n           '-hls_wrap', '0',\n#            '-hls_flags', 'single_file',  # 生成单个文件(有bug)\n           r'F:\\Workspace\\Test\\videos\\playlist.m3u8'], stdin=PIPE)\nprint(p)\n\nt = 1 / 24\nfor i, path in enumerate(Path('frames').rglob('*.jpg')):\n    #     print(i, path)\n    p.stdin.write(open(str(path), 'rb').read())\n\np.stdin.close()\np.wait()\nprint('ok')
", + "tags": [ + "Python", + "FFmpeg", + "HLS" + ] + }, + { + "id": "https://pyqt5.com/processinclass_625781186.html", + "url": "https://pyqt5.com/processinclass_625781186.html", + "title": "python 在类里使用进程池", + "date_published": "2018-11-16T13:37:31.000Z", + "content_html": "
    \n
  1. 首先, 进程池的作用就是减少进程的创建和释放 开销的, 所以在类中作为局部变量是不合适的;
  2. \n
  3. 其次, 进程池必须在 if __name__ == "__main__" 里 ,否则会报 frozen_ 什么什么的错误;(这一点可能解释有误);
  4. \n
\n\n
    \n
  1. 然后, 线程池的 apply_async 中如果传入 self.xxx 方法,会报 multiprocessing.Pool pickling error 什么的错误, 具体解释见 https://blog.csdn.net/dutsoft/article/details/70336462, 里面有解决方法,但是我没有成功(最开始测试没有现在理解的透彻, 不过应该是可以的); 由于第 1 点 不合理, 所以有什么办法在类 函数中获取 进程池对象 po 的地址:
  2. \n
\n

\"processinclass1\"

\n

我的解决思路和方法是:

\n
    \n
  1. 通过 globals () 取得全局变量 , 测试证明 :不同文件的 globals() 是不同的: 如 Tab2.py globals() main_extra_func_file.py 中的 globals() 是不同的 , 所以 这样在 Tab2.py 中取不到 po 对象;
  2. \n
  3. 通过 __main__.po 来获取 (为什么会想到这个呢, 因为有时候导包 import .xxx 和 import xxx 会报 __main__ 没有什么属性什么的):
  4. \n
\n
def getPoolObject():\n# po 的名字在main函数中定义\n# __main__ 模块在sys.modules 的键是\"__mp_main__\"\n    return sys.modules[\"__mp_main__\"].po
\n

ps : (图没截好 , rglob_worker 是外部函数 , 非类内函数 ,po = getPoolBojcet () 这一行是类内函数 ,红色箭头 2. 在的那条白色分割线 是 2 个函数。)

\n

\"processinclass2\"

\n

len(po._cache) == 1 : po._cache 是当前有任务的进程数, ==1 表示所有任务结束;利用回调 , 可以更轻松地进行进程通信。

\n", + "tags": [ + "进程" + ] + }, + { + "id": "https://pyqt5.com/daemonthread.html", + "url": "https://pyqt5.com/daemonthread.html", + "title": "多线程之守护线程和阻塞线程", + "date_published": "2018-10-24T07:51:15.000Z", + "content_html": "

如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的 daemon 属性。

\n\n

即在线程开始(thread.start ())之前,调用 setDeamon()函数,设定线程的 daemon 标志。

\n

(thread.setDaemon (True))就表示这个线程 “不重要”。

\n

如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用 thread.setDaemon (False),设置 daemon 的值为 false。新的子线程会继承父线程的 daemon 标志。

\n

整个 Python 会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。

\n

setDaemon () 函数要放在 start 之前设置才行。

\n
import threading\nimport time\n\ndef func():\n    print(\"子线程开启:\", time.localtime())\n    time.sleep(2)\n    print(\"子线程结束:\", time.localtime())\n\n\nprint(\"主线程开启:\", time.localtime())\nt = threading.Thread(target=func, args=())\n# t.setDaemon(True)\nt.start()\nprint(\"主线程关闭:\", time.localtime())
\n

在 Python 的多线程编程中,在实例代码中经常有 thread1.join () 这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。

\n

join 的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的 join 函数。

\n

先看看这个:

\n
    \n
  1. 阻塞主进程,专注于执行多线程中的程序。
  2. \n
  3. 多线程多 join 的情况下,依次执行各线程的 join 方法,前头一个结束了才能执行后面一个。
  4. \n
  5. 无参数,则等待到该线程结束,才开始执行下一个线程的 join。
  6. \n
  7. 参数 timeout 为线程的阻塞时间,如 timeout=2 就是罩着这个线程 2s 以后,就不管他了,继续执行下面的代码。
  8. \n
  9. 下面的例子是一次阻塞子线程,每个子线程都会等上个子线程 join 结束才会执行,如果注释掉 t.join 则会同时执行 5 个子线程,多线程在做网络访问的时候可以减少等待时间,那么在一个工作流程中可以将访问网络接口的情况做成多线程。
  10. \n
\n
import threading, time\n\ndef func():\n    print(\"hello world!\")\n    time.sleep(1)\n\nprint(\"hello main start\")\nfor i in range(5):\n    t = threading.Thread(target=func, args=())\n    print(t.getName())\n    t.start()\n    t.join()
", + "tags": [ + "Python", + "线程" + ] + }, + { + "id": "https://pyqt5.com/cgitb.html", + "url": "https://pyqt5.com/cgitb.html", + "title": "异常捕获之cgitb模块", + "date_published": "2018-09-17T15:17:06.000Z", + "content_html": "

cgitb 模块为 Python 脚本提供了一个特殊的异常管理器。名字有点误导人,它最初设计是为了以 HTML 格式展示 cgi 脚本的大量异常信息。后来,他扩展为也可以展示纯文本信息。该模块激活后,如果发生了未捕获的异常,将会展示格式化的输出报告。该报告包括源代码每一层的回溯,以及当前执行程序的参数和局部变量。以及,你可以选择将这些信息存到一个文件里,而不是发送到浏览器。

\n\n

# 用途

\n

当编辑器中无法显示错误信息时,尤其是 PyQt ,可以尝试在 cmd 中运行代码,或者使用此模块来得到错误信息。

\n

# 介绍

\n

# cgitb.enable

\n
cgitb.enable(display=1, logdir=None, context=5, format=\"html\")
\n

参数说明

\n
    \n
  1. display 1,发送至浏览器;0, 不发送
  2. \n
  3. logdir 如果有的话,写到该目录下
  4. \n
  5. context 显示错误代码周围的代码行数
  6. \n
  7. format 是否显示为 HTML,除了’html’之外的所有值,都会显示为纯文本
  8. \n
\n

# cgitb.handle

\n
cgitb.handle(info=None)
\n

参数说明

\n
    \n
  1. 如果你想用 cgitb 处理异常,你可以调用这个函数。
  2. \n
  3. info 应当是含有异常类型、异常值和 traceback 对象的三元组
  4. \n
  5. 如同 sys.exc_info () 返回的那样。如果不提供 info,则从 sys.exc_info 中获取。
  6. \n
\n

# 如何使用

\n

以下代码放在最开始执行

\n
import cgitb\nimport sys\nsys.excepthook = cgitb.Hook(1, None, 5, sys.stderr, 'text')
\n", + "tags": [ + "Python", + "异常" + ] + } + ] +} \ No newline at end of file diff --git "a/category/\347\254\224\350\256\260/rss.xml" "b/category/\347\254\224\350\256\260/rss.xml" new file mode 100644 index 00000000..29ce4501 --- /dev/null +++ "b/category/\347\254\224\350\256\260/rss.xml" @@ -0,0 +1,647 @@ + + + + PyQt • Posts by "笔记" category + https://pyqt5.com + Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6 + zh-CN + Sat, 07 Oct 2023 06:08:06 +0000 + Sat, 07 Oct 2023 06:08:06 +0000 + PyQt + 动画 + 阴影 + 信号 + Python + 截图 + 异常 + 圆形 + 图片 + 线程 + Model + FFmpeg + HLS + 翻转 + 窗口 + 滑动条 + 特效 + Mac + M1 + 菜单 + 轮播 + 进程 + pyqt hook key + Asyncio + 异步 + subprocess.Popen + 拦截print + pytest-qt + python 状态机 + 气泡 + .9png + QWebView + QWebEngineView + 浏览器 + debug + snoop + 无边框 + 圆角 + 边框 + Github + 编辑器 + PyQt5 PySide2 + Designer + 设计师 + virtualenvwrapper + virtualenv + + https://pyqt5.com/macm1pyqt.html + 如何在Mac M1上快速安装PyQt5 + https://pyqt5.com/macm1pyqt.html + PyQt + Mac + M1 + Sat, 07 Oct 2023 06:08:06 +0000 + + + + https://pyqt5.com/studynotes.html + PyQt学习心得 + https://pyqt5.com/studynotes.html + PyQt + Mon, 26 Aug 2019 01:00:00 +0000 + + + + https://pyqt5.com/QPropertyAnimation.html + PyQt属性动画(QPropertyAnimation) + https://pyqt5.com/QPropertyAnimation.html + PyQt + 动画 + Wed, 08 May 2019 07:43:06 +0000 + + + + https://pyqt5.com/viewapi.html + 如何查阅Qt文档 + https://pyqt5.com/viewapi.html + PyQt + Sat, 04 May 2019 12:50:20 +0000 + + + + https://pyqt5.com/speedgithub.html + 解决GitHub下载速度缓慢的问题 + https://pyqt5.com/speedgithub.html + Github + Thu, 18 Apr 2019 00:59:06 +0000 + + + + https://pyqt5.com/ffmpeghls.html + FFmpeg合成加密HLS记录 + https://pyqt5.com/ffmpeghls.html + Python + FFmpeg + HLS + Sat, 12 Jan 2019 11:28:06 +0000 + + + + https://pyqt5.com/processinclass_625781186.html + python 在类里使用进程池 + https://pyqt5.com/processinclass_625781186.html + 进程 + Fri, 16 Nov 2018 13:37:31 +0000 + + + + https://pyqt5.com/daemonthread.html + 多线程之守护线程和阻塞线程 + https://pyqt5.com/daemonthread.html + Python + 线程 + Wed, 24 Oct 2018 07:51:15 +0000 + + + + https://pyqt5.com/cgitb.html + 异常捕获之cgitb模块 + https://pyqt5.com/cgitb.html + Python + 异常 + Mon, 17 Sep 2018 15:17:06 +0000 + + + + diff --git "a/category/\351\232\217\347\254\224/feed.json" "b/category/\351\232\217\347\254\224/feed.json" new file mode 100644 index 00000000..e71db226 --- /dev/null +++ "b/category/\351\232\217\347\254\224/feed.json" @@ -0,0 +1,106 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "PyQt • All posts by \"随笔\" category", + "description": "Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6", + "home_page_url": "https://pyqt5.com", + "items": [ + { + "id": "https://pyqt5.com/equal_str_width_625781186.html", + "url": "https://pyqt5.com/equal_str_width_625781186.html", + "title": "python 判断屏幕等宽字符串的长度  ", + "date_published": "2019-12-26T11:49:41.000Z", + "content_html": "

判断屏幕等宽字符串的长度?

\n\n

判断屏幕等宽字符串的长度?

\n

\"image.png\"

\n

【新手】重庆 - 搬砖 - NoWait 22:41:50 @北京 - BUG 开发 - 黑择明 求指点
\n【专家】北京 - BUG 开发 - 黑择明 22:43:04 fontMetrics
\n【专家】 https://pyqt.site (892768447) 22:43:54 QFontMetrics
\n【专家】 https://pyqt.site (892768447) 22:44:09 通过 QLabel.font ().fontMetrics () 得到

\n

【新手】重庆 - 搬砖 - NoWait 22:52:00
\nhttps://stackoverflow.com/questions/35771863/how-to-calculate-length-of-string-in-pixels-for-specific-font-and-size
\n\"image.png\"

\n

【新手】重庆 - 搬砖 - NoWait 22:53:15 感觉和 fontMetrics 应该是差不多的

\n

\"image.png\"

\n
\n

【专家】北京 - BUG 开发 - 黑择明 (996742224) 11:29:04
\nfm = QFontMetrics(QFont())
\nfm.width(“qweqwe”)

\n", + "tags": [ + "Python" + ] + }, + { + "id": "https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html", + "url": "https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html", + "title": "修改pyuic代替pyside2-uic.", + "date_published": "2019-12-26T11:49:41.000Z", + "content_html": "

修改 pyuic 代替 pyside2-uic

\n\n

修改 pyuic 代替 pyside2-uic.

\n

最近看到挺多人用 pyside2 的 uic 编译 ui 文件有问题 .
\n 写个解决办法.

\n

首先,
\n pip install qtpy ,
\n 这个是兼容 pyqt5 和 pyside2 的,无缝转换 .

\n

然后,
\n 修改 pyqt5 的 uic ,

\n

\"image.png\"

\n

最后用 pyuic5 , 生成 Ui_XXX.py 文件 .

\n", + "tags": [ + "PyQt5 PySide2" + ] + }, + { + "id": "https://pyqt5.com/python_statemachine_625781186.html", + "url": "https://pyqt5.com/python_statemachine_625781186.html", + "title": "python 状态机模块  ", + "date_published": "2019-07-17T09:03:33.000Z", + "content_html": "

用状态来取代 if…else 判断。

\n\n

GUI 涉及到挺多的状态改变,以前一直用 if…else 来判断,最近读了设计模式,发现有个状态模式,随后发现了状态机这个东西 .

\n

python 的状态机模块挺多的,不过好像很多都不更新了.
\n 推荐 2 个状态机模块,但是也没有太深入的使用经验,就跑跑例子,以后有更详细的 pyqt 例子再补上 .

\n

1: pip install python-statemachine

\n

官方例子 : https://github.com/fgmacedo/python-statemachine

\n

2. pip install state_machine

\n

官方例子 : https://github.com/jtushman/state_machine

\n

1 的 最近一次更新在 6 个月以前,使用 类继承mixin 方式,不过有些地方不如 2 个人性化;

\n

2 的设计更人性化一些,包括状态改变 beforeafter , 不过由于是装饰器实现的动态增加属性,有些地方编辑器智能提示可能就靠不上了.

\n

两者实现实现方式不一样,有兴趣可以读读源码 .

\n
    \n
  1. qt 内置状态机框架
  2. \n
\n

https://blog.csdn.net/amnes1a/article/details/62418196

\n

https://blog.csdn.net/dongfenghuojian/article/details/78187131

\n

http://blog.sina.com.cn/s/articlelist_3284623693_0_1.html (系列教程)

\n", + "tags": [ + "Python", + "python 状态机" + ] + }, + { + "id": "https://pyqt5.com/pyqt5_hook_key_625781186.html", + "url": "https://pyqt5.com/pyqt5_hook_key_625781186.html", + "title": "在pyqt中使用python全局钩子模块", + "date_published": "2019-07-06T17:37:22.000Z", + "content_html": "

在某些时候需要为自己的软件增加全局键盘监听,比如软件最小化隐藏后可以通过热键唤醒,又或者比如像 QQ 一样可以全局热键截图。这里介绍几个方法实现在 PyQt 中使用 Python 全局钩子模块实现全局热键功能。

\n\n
    \n
  1. pyHook3
  2. \n
\n

安装命令 : pip install pyhook3

\n

https://blog.csdn.net/q871063970/article/details/86648386

\n

似乎将 pyhook 支持 py3 版本的了?没有太多研究.

\n

缺点:只支持 win 平台.

\n

2. keyboard & mouse

\n

安装命令: pip install keyboard mouse

\n
\nfrom PyQt5 import  QtGui, QtWidgets, QtCore\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtWidgets import *\nimport keyboard\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.testBtn = QPushButton(self)\n        layout.addWidget(self.testBtn)\n\n        keyboard.add_hotkey('ctrl+shift+x', lambda:print('triggered', 'hotkey'))\n        keyboard.add_hotkey('ctrl+shift+c', self.abc,args=('aa',"bb","cc"))\n\n    def abc(self,a,b,c):\n        print(a,b,c)\n        \nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

更详细例子 : pyqt 中使用 keyboard 全局热键

\n

优点:跨平台;

\n

缺点:模块名字取得太差,不容易被发现.

\n", + "tags": [ + "Python", + "pyqt hook key" + ] + }, + { + "id": "https://pyqt5.com/read_open_source.html", + "url": "https://pyqt5.com/read_open_source.html", + "title": "像读文章一样读源码", + "date_published": "2019-07-06T17:37:22.000Z", + "content_html": "

使用 snoop, 像读文章一样读源码。

\n\n

不得不说 开源项目没有一个提纲 , 看起来太操蛋了。问了作者, 作者说 , 你运行下主函数, 然后慢慢跟 。。。
\n\"image.png\"

\n

没有目的地概览 , 不知不觉就追究到细节里面去了。

\n

\"image.png\"

\n

所以这一篇文章的目地就是 , 如何在没有提纲的情况下 , 能更好的只关注流程 , 而不是细节 。

\n

开始 :

\n
    \n
  1. python DEBUG 模块介绍 :
    \n 前段时间看过挺多文章提到 pysoonper 这个调试模块,有兴趣的可以百度一下.
    \n 个人尝试了一下,篇幅过大的 DEBUG 不适合用 pysoonper , 因为没有缩进!
    \n 这几天偶然遇到一个二次封装的模块 snoop, 完美地解决了这个问题.
  2. \n
  3. 操作步骤 :
  4. \n
\n\n

发现可以折叠 , 但是最大可折叠等级只到 5 级 , 而且无法对对应等级折叠 , 有点遗憾 。也许是.log 格式选得不太好, 不知道是否有更好的后缀格式。

\n\n

callreturn 给加进去.

\n\n

\"eric6启动阶段\"

\n

\"image.png\"

\n

#000 是为了方便搜索 。
\n需要自己手动折叠 。
\n可以发现 每个 splash.showMessage() 都是一个阶段 , 展开折叠之后就是每个阶段具体执行细节 。

\n
\n

# ps: vscode 阅读 log 文件还是有一些不方便的地方,除了在 2. 中提到的,还有包括关闭文件再打开,折叠状态不会保留,有其他更好的方式 请留言告诉我,谢谢.

\n", + "tags": [ + "Python", + "debug", + "snoop" + ] + }, + { + "id": "https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html", + "url": "https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html", + "title": "python 获取子进程print信息  ", + "date_published": "2019-05-24T06:39:44.000Z", + "content_html": "

在 PyQt 中使用子线程读取子进程 Python 脚本的 print 输出流内容。

\n\n

问题所在:

\n

\"image.png\"

\n

如果模块都由自己开发, 正常操作

\n

\"image.png\"

\n

但是因为不能改,所以只能拦截:
\n代码:

\n
pythonPath = self.pythonPath_cb.currentText()\n\nif suffix == \"py\":\n    # 首次\n    self.pyCommand = [pythonPath, path]\n    self.modifiedReloadPython(path)\ndef modifiedReloadPython(self, path_):\n    os.chdir(os.path.dirname(path_))\n    # 子进程调用\n    self.p = subprocess.Popen(self.pyCommand, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n    # self.stdoutWorker.p = self.p\n    self.stdoutWorker = Worker(self.p)\n    self.stdoutWorker.stdout_signal.connect(lambda x: self.error_te.append(\"PYDEBUG:\\n\" + x))\n    self.stdoutWorker.start()\nclass Worker(QThread):\n    stdout_signal = pyqtSignal(str)\n\n    def __init__(self, p, parent=None):\n        super().__init__(parent)\n        self.p = p\n\n    def run(self):\n        while True:\n            QApplication.processEvents()\n            if self.p is not None:\n                line = self.p.stdout.readline()\n                # line = line.strip()\n                if line != b'':\n                    try:\n                        info = line.decode()\n                        self.stdout_signal.emit(info)\n                    except:\n                        self.stdout_signal.emit(repr(line))\n    
\n", + "tags": [ + "Python", + "subprocess.Popen", + "拦截print" + ] + }, + { + "id": "https://pyqt5.com/suggesteditor.html", + "url": "https://pyqt5.com/suggesteditor.html", + "title": "推荐编辑器LiClipse", + "date_published": "2019-05-04T10:04:08.000Z", + "content_html": "

关于 Python 的开发编辑器有很多,每个人有每个人的喜好,经常看到很多在问什么编辑器好用,有人推荐 Sublime,有人推荐 Pycharm 等等,这里就不去比较其它编辑器的优缺点了,只谈谈关于 LiClipse 这个编辑器在初级使用阶段的智能提示功能等。开箱即用,支持多种语言,RST,Markdown 和 HTML 编辑器的 HTML 预览。

\n\n

其实 LiClipse 这个编辑器就是以前的 PyDev 插件的独立版本,基于 Eclipse 编辑器开发,去掉了 Java 的相关开发功能,关于软件的详细说明可以去官网查看: http://www.liclipse.com/

\n

编辑器只需要少量的配置,打开即可使用,快速自动 import,也可以根据需要安装自己所需的插件,比如 json、svn、主题插件等。个人推荐:适合刚入门的新手使用

\n

由于新版的 PyQt 和 PyDev 去掉了详细的函数提示,所以 PyQt 的智能提示只有函数和返回值,并没有英文注释,但是以前的比如 PyQt4 的智能提示应该是有详细的英文注释提示。

\n

# 界面预览

\n
    \n
  1. 主界面
    \n\"editor1\"
  2. \n
  3. 鼠标悬停提示
    \n\"editor2\"
  4. \n
  5. 输入提示
    \n\"editor3\"
  6. \n
  7. Git 面板
    \n\"editor4\"
  8. \n
  9. 全局搜索(Ctrl + H)
    \n\"editor5\"
    \n\"editor6\"
  10. \n
\n

# 自动导包

\n

其实这个功能我是非常喜欢的,通过按下快捷键即可自动寻找包名导入,快捷键 Ctrl + Shift + O

\n

\"editor_import\"

\n

也可以在标红的代码上按下 Ctrl + F1 进行导入

\n

\"editor_import2\"

\n

# 配置

\n

打开编辑器后首先要配置【Window -> Preferences】的就是 Python 的环境变量,可以同时添加多个 Python 版本

\n

\"editor_env\"

\n

# Tab 等设置

\n
    \n
  1. Insert spaces for tabs tab 转空格
  2. \n
  3. Show line numbers 显示行号
  4. \n
\n

\"editor_tab\"

\n

# 模版

\n

这个功能可以快速插入自己定义好的模版代码,比如 if __name__ == '__main__': 等等,比如我这里配置的创建文件的模版

\n

\"editor_tpl\"

\n

# 常用快捷键

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
格式化对齐Ctrl + Shift + F
自动导包Ctrl + Shift + O
快捷提示Alt + /
\n", + "tags": [ + "编辑器" + ] + }, + { + "id": "https://pyqt5.com/virtualenvpy_625781186.html", + "url": "https://pyqt5.com/virtualenvpy_625781186.html", + "title": "python 拷贝虚拟环境(一)  ", + "date_published": "2019-05-02T07:21:01.000Z", + "content_html": "

通常来说,刚开始使用 python 的时候都是把包装到全局路径,随着各个项目安装的包越来越多,之后每开始一个项目,pycharm 创建索引的时间都越来越漫长,所以不可避免得开始使用虚拟环境。
\n经过一番了解 ,虚拟环境的优点有这些:

\n\n\n

python 虚拟环境库除了自带的 venv , 还有三方库 virtualenv , 此外 在 virtualenv 基础上又开发了 virtualenvwrapper(virtualenvwrapper_win) 来管理

\n

本文基于 virtualenvwrapper 创建的虚拟环境来讲解.

\n
以下是收集的一些virtualenvwrapper配置教程:\n# linux平台\nhttps://www.cnblogs.com/netfoxman/p/5994697.html\n# window平台\nhttps://blog.csdn.net/shaququ/article/details/54292043   \nhttps://blog.csdn.net/iaau0908/article/details/54021518\n
\n

虚拟环境创建多了我们就会发现,
\n 有时候使用相同版本的环境,一些常用的库是需要重新安装的,
\n 那么能不能创建一个基础环境,默认拥有这些库,然后在这个基础环境上继续安装三方库呢?

\n

本文经过试验发现是可行的:

\n
    \n
  1. \n

    创建基础虚拟环境 mkvirtualenv <环境名称> [-p空格python其他版本的解释器路径] . 例如 mkvirtualenv py34 -p c:\\Python34\\python.exe

    \n
  2. \n
  3. \n

    切换到虚拟环境 workon py34 , 然后安装一下三方库,然后复制 py34 这个文件夹备份一下;

    \n
  4. \n
  5. \n

    接着复制这个 py34 文件夹,把复制后的文件夹改名为我们需要需要的文件夹例如 new34

    \n
  6. \n
  7. \n

    进入 new34文件夹 ,用任意编辑器全路径搜索 py34 (替换虚拟环境的路径)

    \n
  8. \n
  9. \n

    删除 new34/Scripts 下的 pip.exe, pip3.exe, pip3.x.exe, easy_install.exe (因为安装路径硬编码到这里面了,改不了,需要重新安装)

    \n
  10. \n
  11. \n

    https://blog.csdn.net/douniwan007009/article/details/81463958 按方式二,源码安装 setuptools 后再用 easy_install pip 安装 pip 后,完成;
    \n 如果有问题,就继续按照方式一的源码安装 pip;

    \n
  12. \n
  13. \n

    new34 环境下 用 pip show 三方库 来看一些库的位置,确保正确.

    \n
  14. \n
\n", + "tags": [ + "Python", + "virtualenvwrapper", + "virtualenv" + ] + }, + { + "id": "https://pyqt5.com/pyqtclient.html", + "url": "https://pyqt5.com/pyqtclient.html", + "title": "PyQtClient例子客户端", + "date_published": "2019-02-02T07:15:06.000Z", + "content_html": "

\"1.gif\" 对本博客所写的项目 PyQt 例子进行一个客户端的编写,客户端主要实现一些动画效果,更换皮肤,运行例子等功能。\"2.gif\"

\n\n

# 项目地址

\n
\n

# Windows 客户端下载

\n
    \n
  1. 包含部分例子
  2. \n
  3. 不包含例子
  4. \n
  5. 百度网盘 提取码: nadv
  6. \n
\n

# 效果图

\n

\"PyQtClient\"

\n", + "tags": [ + "PyQt" + ] + } + ] +} \ No newline at end of file diff --git "a/category/\351\232\217\347\254\224/rss.xml" "b/category/\351\232\217\347\254\224/rss.xml" new file mode 100644 index 00000000..89014314 --- /dev/null +++ "b/category/\351\232\217\347\254\224/rss.xml" @@ -0,0 +1,426 @@ + + + + PyQt • Posts by "随笔" category + https://pyqt5.com + Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6 + zh-CN + Thu, 26 Dec 2019 11:49:41 +0000 + Thu, 26 Dec 2019 11:49:41 +0000 + PyQt + 动画 + 阴影 + 信号 + Python + 截图 + 异常 + 圆形 + 图片 + 线程 + Model + FFmpeg + HLS + 翻转 + 窗口 + 滑动条 + 特效 + Mac + M1 + 菜单 + 轮播 + 进程 + pyqt hook key + Asyncio + 异步 + subprocess.Popen + 拦截print + pytest-qt + python 状态机 + 气泡 + .9png + QWebView + QWebEngineView + 浏览器 + debug + snoop + 无边框 + 圆角 + 边框 + Github + 编辑器 + PyQt5 PySide2 + Designer + 设计师 + virtualenvwrapper + virtualenv + + https://pyqt5.com/equal_str_width_625781186.html + python 判断屏幕等宽字符串的长度   + https://pyqt5.com/equal_str_width_625781186.html + Python + Thu, 26 Dec 2019 11:49:41 +0000 + + + + https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html + 修改pyuic代替pyside2-uic. + https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html + PyQt5 PySide2 + Thu, 26 Dec 2019 11:49:41 +0000 + + + + https://pyqt5.com/python_statemachine_625781186.html + python 状态机模块   + https://pyqt5.com/python_statemachine_625781186.html + Python + python 状态机 + Wed, 17 Jul 2019 09:03:33 +0000 + + + + https://pyqt5.com/pyqt5_hook_key_625781186.html + 在pyqt中使用python全局钩子模块 + https://pyqt5.com/pyqt5_hook_key_625781186.html + Python + pyqt hook key + Sat, 06 Jul 2019 17:37:22 +0000 + + + + https://pyqt5.com/read_open_source.html + 像读文章一样读源码 + https://pyqt5.com/read_open_source.html + Python + debug + snoop + Sat, 06 Jul 2019 17:37:22 +0000 + + + + https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html + python 获取子进程print信息   + https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html + Python + subprocess.Popen + 拦截print + Fri, 24 May 2019 06:39:44 +0000 + + + + https://pyqt5.com/suggesteditor.html + 推荐编辑器LiClipse + https://pyqt5.com/suggesteditor.html + 编辑器 + Sat, 04 May 2019 10:04:08 +0000 + + + + https://pyqt5.com/virtualenvpy_625781186.html + python 拷贝虚拟环境(一)   + https://pyqt5.com/virtualenvpy_625781186.html + Python + virtualenvwrapper + virtualenv + Thu, 02 May 2019 07:21:01 +0000 + + + + https://pyqt5.com/pyqtclient.html + PyQtClient例子客户端 + https://pyqt5.com/pyqtclient.html + PyQt + Sat, 02 Feb 2019 07:15:06 +0000 + + + + diff --git a/cgitb.html b/cgitb.html new file mode 100644 index 00000000..53ed7cd6 --- /dev/null +++ b/cgitb.html @@ -0,0 +1,298 @@ +异常捕获之cgitb模块 | PyQt + + + + + + + + + + + + + + +

异常捕获之cgitb模块

cgitb 模块为 Python 脚本提供了一个特殊的异常管理器。名字有点误导人,它最初设计是为了以 HTML 格式展示 cgi 脚本的大量异常信息。后来,他扩展为也可以展示纯文本信息。该模块激活后,如果发生了未捕获的异常,将会展示格式化的输出报告。该报告包括源代码每一层的回溯,以及当前执行程序的参数和局部变量。以及,你可以选择将这些信息存到一个文件里,而不是发送到浏览器。

+ +

# 用途

+

当编辑器中无法显示错误信息时,尤其是 PyQt ,可以尝试在 cmd 中运行代码,或者使用此模块来得到错误信息。

+

# 介绍

+

# cgitb.enable

+
cgitb.enable(display=1, logdir=None, context=5, format="html")
+

参数说明

+
    +
  1. display 1,发送至浏览器;0, 不发送
  2. +
  3. logdir 如果有的话,写到该目录下
  4. +
  5. context 显示错误代码周围的代码行数
  6. +
  7. format 是否显示为 HTML,除了’html’之外的所有值,都会显示为纯文本
  8. +
+

# cgitb.handle

+
cgitb.handle(info=None)
+

参数说明

+
    +
  1. 如果你想用 cgitb 处理异常,你可以调用这个函数。
  2. +
  3. info 应当是含有异常类型、异常值和 traceback 对象的三元组
  4. +
  5. 如同 sys.exc_info () 返回的那样。如果不提供 info,则从 sys.exc_info 中获取。
  6. +
+

# 如何使用

+

以下代码放在最开始执行

+
import cgitb
+import sys
+sys.excepthook = cgitb.Hook(1, None, 5, sys.stderr, 'text')
+
文章作者: Irony
文章链接: https://pyqt5.com/cgitb.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/circleimage.html b/circleimage.html new file mode 100644 index 00000000..406c6cf0 --- /dev/null +++ b/circleimage.html @@ -0,0 +1,434 @@ +PyQt5圆形图片 | PyQt + + + + + + + + + + + + + + + +

PyQt5圆形图片

实现圆形图片的方法有很多,比如用遮罩(mask), 裁切等等。这里比较几种实现方式,选出个人认为最优的方案。

+ +

https://github.com/PyQt5/PyQt/blob/master/QLabel/CircleImage.py

+

# 采用 mask 方式

+

具体参考 【Qt】QLabel 实现的圆形图像 - 米罗西 - 博客园

+

# 画圆形遮盖(适合纯色背景)

+

原理是在原图片上画一个 4 角有颜色,中间圆形镂空的图片。

+

circleimage1

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Created on 2017年8月25日
+@author: Irony."[讽刺]
+@site: https://pyqt5.com, https://github.com/892768447
+@email: 892768447@qq.com
+@description: 
+'''
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QPixmap, QPainter, QPainterPath
+from PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout
+
+
+__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
+__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
+__Version__ = "Version 1.0"
+
+
+class Label(QLabel):
+
+    def __init__(self, *args, antialiasing=True, **kwargs):
+        super(Label, self).__init__(*args, **kwargs)
+        self.Antialiasing = antialiasing
+        self.setMaximumSize(200, 200)
+        self.setMinimumSize(200, 200)
+        self.radius = 100
+
+        #加载图片并缩放
+        self.image = QPixmap("head.jpg").scaled(
+            200, 200, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
+
+        painter = QPainter(self.image)
+        if self.Antialiasing:
+            painter.setRenderHint(QPainter.Antialiasing, True)
+            painter.setRenderHint(QPainter.HighQualityAntialiasing, True)
+            painter.setRenderHint(QPainter.SmoothPixmapTransform, True)
+
+        path = QPainterPath()
+        path.addRoundedRect(
+            0, 0, self.width(), self.height(), self.radius, self.radius)
+        path.addRect(0,0,self.width(),self.height())
+        painter.setPen(Qt.NoPen)
+        painter.setBrush(Qt.green)
+        painter.drawPath(path)
+        self.setPixmap(self.image)
+
+
+class Window(QWidget):
+
+    def __init__(self, *args, **kwargs):
+        super(Window, self).__init__(*args, **kwargs)
+        layout = QHBoxLayout(self)
+        layout.addWidget(Label(self))
+        layout.addWidget(Label(self, antialiasing=False))
+        self.setStyleSheet("background: black;")
+
+if __name__ == "__main__":
+    import sys
+    from PyQt5.QtWidgets import QApplication
+    app = QApplication(sys.argv)
+    w = Window()
+    w.show()
+    sys.exit(app.exec_())
+

# 使用 QPainter 的 setCompositionMode

+

具体参考 Qt 圆形头像制作工具 抗锯齿 可缩放编辑

+
//result_avatar_size 是我们最后生成的图片的长宽,可以是QSize(200, 200)的正圆
+destination_image = QImage(result_avatar_size, QImage::Format_ARGB32_Premultiplied);
+//在黑色的正方形中间画一个透明的圆,作为头像遮罩
+QPainter painter(&destination_image);
+painter.setRenderHint(QPainter::Antialiasing);
+//全涂黑
+painter.fillRect(destination_image.rect(), QBrush(Qt::black, Qt::SolidPattern));
+painter.setCompositionMode(QPainter::CompositionMode_SourceOut);
+painter.setPen(Qt::NoPen);
+painter.setBrush(QBrush(Qt::transparent, Qt::SolidPattern));
+//画透明区域
+painter.drawEllipse(destination_image.rect());
+

# 使用 QPainter 的切割方法(推荐)

+

利用 QPainter.setClipPath 方法切割一个圆形的 QPainterPath

+

circleimage2

+
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Created on 2017年8月25日
+@author: Irony."[讽刺]
+@site: https://pyqt5.com, https://github.com/892768447
+@email: 892768447@qq.com
+@file: 
+@description: 
+'''
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QPixmap, QPainter, QPainterPath, QPen
+from PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout
+
+
+__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
+__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
+__Version__ = "Version 1.0"
+
+
+class Label(QLabel):
+
+    def __init__(self, *args, antialiasing=True, **kwargs):
+        super(Label, self).__init__(*args, **kwargs)
+        self.Antialiasing = antialiasing
+        self.setMaximumSize(200, 200)
+        self.setMinimumSize(200, 200)
+        self.radius = 100
+
+        #####################核心实现#########################
+        self.target = QPixmap(self.size())  # 大小和控件一样
+        self.target.fill(Qt.transparent)  # 填充背景为透明
+
+        p = QPixmap("head.jpg").scaled(  # 加载图片并缩放和控件一样大
+            200, 200, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
+
+        painter = QPainter(self.target)
+        if self.Antialiasing:
+            # 抗锯齿
+            painter.setRenderHint(QPainter.Antialiasing, True)
+            painter.setRenderHint(QPainter.HighQualityAntialiasing, True)
+            painter.setRenderHint(QPainter.SmoothPixmapTransform, True)
+
+#         painter.setPen(# 测试黑色圆圈
+#             QPen(Qt.black, 5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
+        path = QPainterPath()
+        path.addRoundedRect(
+            0, 0, self.width(), self.height(), self.radius, self.radius)
+        #**** 切割为圆形 ****#
+        painter.setClipPath(path)
+#         painter.drawPath(path)  # 测试黑色圆圈
+
+        painter.drawPixmap(0, 0, p)
+        self.setPixmap(self.target)
+        #####################核心实现#########################
+
+class Window(QWidget):
+
+    def __init__(self, *args, **kwargs):
+        super(Window, self).__init__(*args, **kwargs)
+        layout = QHBoxLayout(self)
+        layout.addWidget(Label(self))
+        layout.addWidget(Label(self, antialiasing=False))
+        self.setStyleSheet("background: black;")
+
+if __name__ == "__main__":
+    import sys
+    from PyQt5.QtWidgets import QApplication
+    app = QApplication(sys.argv)
+    w = Window()
+    w.show()
+    sys.exit(app.exec_())
文章作者: Irony
文章链接: https://pyqt5.com/circleimage.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 00000000..f3a52233 --- /dev/null +++ b/css/index.css @@ -0,0 +1,4645 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +main { + display: block +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none +} +.limit-one-line, +#article-container .flink .flink-item-name, +#article-container .flink .flink-item-desc, +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span, +.site-data > a .headline, +#nav #blog-info, +#pagination .prev_info, +#pagination .next_info, +#sidebar #sidebar-menus .menus_items .site-page { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.limit-more-line, +.error404 #error-wrap .error-content .error-info .error_subtitle, +.article-sort-item-title, +#recent-posts > .recent-post-item >.recent-post-info > .article-title, +#recent-posts > .recent-post-item >.recent-post-info > .content, +#aside-content .aside-list > .aside-list-item .content > .name, +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment, +#post-info .post-title, +.relatedPosts > .relatedPosts-list .content .title, +#article-container figure.gallery-group p, +#article-container figure.gallery-group .gallery-group-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; +} +.fontawesomeIcon, +.custom-hr:before, +#article-container.post-content h1:before, +#article-container.post-content h2:before, +#article-container.post-content h3:before, +#article-container.post-content h4:before, +#article-container.post-content h5:before, +#article-container.post-content h6:before, +#article-container.post-content hr:before, +#post .post-copyright:before, +#post .post-outdate-notice:before, +.note:not(.no-icon)::before, +.search-dialog hr:before { + display: inline-block; + font-weight: 600; + font-family: 'Font Awesome 6 Free'; + text-rendering: auto; + -webkit-font-smoothing: antialiased; +} +.cardHover, +.error404 #error-wrap .error-content, +.layout > div:first-child:not(.recent-posts), +#recent-posts > .recent-post-item, +#aside-content .card-widget, +.layout > .recent-posts .pagination > *:not(.space) { + border-radius: 8px; + background: var(--card-bg); + box-shadow: var(--card-box-shadow); + transition: all 0.3s; +} +.cardHover:hover, +.error404 #error-wrap .error-content:hover, +.layout > div:first-child:not(.recent-posts):hover, +#recent-posts > .recent-post-item:hover, +#aside-content .card-widget:hover, +.layout > .recent-posts .pagination > *:not(.space):hover { + box-shadow: var(--card-hover-box-shadow); +} +.imgHover, +.error404 #error-wrap .error-content .error-img img, +.article-sort-item-img :first-child, +#recent-posts > .recent-post-item .post_cover .post-bg, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child { + width: 100%; + height: 100%; + transition: filter 375ms ease-in 0.2s, transform 0.6s; + -o-object-fit: cover; + object-fit: cover; +} +.imgHover:hover, +.error404 #error-wrap .error-content .error-img img:hover, +.article-sort-item-img :first-child:hover, +#recent-posts > .recent-post-item .post_cover .post-bg:hover, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child:hover { + transform: scale(1.1); +} +.postImgHover:hover .cover, +#pagination .prev-post:hover .cover, +#pagination .next-post:hover .cover, +.relatedPosts > .relatedPosts-list > div:hover .cover { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + transform: scale(1.1); +} +.postImgHover .cover, +#pagination .prev-post .cover, +#pagination .next-post .cover, +.relatedPosts > .relatedPosts-list > div .cover { + position: absolute; + width: 100%; + height: 100%; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + transition: all 0.6s, filter 375ms ease-in 0.2s; + -o-object-fit: cover; + object-fit: cover; +} +.list-beauty, +.category-lists ul { + list-style: none; +} +.list-beauty li, +.category-lists ul li { + position: relative; + padding: 0.12em 0.4em 0.12em 1.4em; +} +.list-beauty li:hover:before, +.category-lists ul li:hover:before { + border-color: var(--pseudo-hover); +} +.list-beauty li:before, +.category-lists ul li:before { + position: absolute; + top: 0.67em; + left: 0; + width: 0.43em; + height: 0.43em; + border: 0.215em solid #49b1f5; + border-radius: 0.43em; + background: transparent; + content: ''; + cursor: pointer; + transition: all 0.3s ease-out; +} +.custom-hr, +#article-container.post-content hr, +.search-dialog hr { + position: relative; + margin: 40px auto; + border: 2px dashed var(--hr-border); + width: calc(100% - 4px); +} +.custom-hr:hover:before, +#article-container.post-content hr:hover:before, +.search-dialog hr:hover:before { + left: calc(95% - 20px); +} +.custom-hr:before, +#article-container.post-content hr:before, +.search-dialog hr:before { + position: absolute; + top: -10px; + left: 5%; + z-index: 1; + color: var(--hr-before-color); + content: '\f0c4'; + font-size: 20px; + line-height: 1; + transition: all 1s ease-in-out; +} +#content-inner, +#footer { + animation: bottom-top 1s; +} +#page-header:not(.full_page) { + animation: header-effect 1s; +} +#site-title, +#site-subtitle { + animation: titleScale 1s; +} +#nav.show { + animation: headerNoOpacity 1s; +} +canvas:not(#ribbon-canvas), +#web_bg { + animation: to_show 4s; +} +#ribbon-canvas { + animation: ribbon_to_show 4s; +} +#sidebar-menus.open > :nth-child(1) { + animation: sidebarItem 0.2s; +} +#sidebar-menus.open > :nth-child(2) { + animation: sidebarItem 0.4s; +} +#sidebar-menus.open > :nth-child(3) { + animation: sidebarItem 0.6s; +} +#sidebar-menus.open > :nth-child(4) { + animation: sidebarItem 0.8s; +} +.scroll-down-effects { + animation: scroll-down-effect 1.5s infinite; +} +.reward-main { + animation: donate_effcet 0.3s 0.1s ease both; +} +@keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + transform: translate(0, 0); + } +} +@keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translateY(0); + } +} +@keyframes headerNoOpacity { + 0% { + transform: translateY(-50px); + } + 100% { + transform: translateY(0); + } +} +@keyframes bottom-top { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: translateY(50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translateY(0); + } +} +@keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: scale(1); + } +} +@keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: scale(0.7); + } +} +@keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes avatar_turn_around { + from { + transform: rotate(0); + } + to { + transform: rotate(360deg); + } +} +@keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translateY(0); + } +} +@keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translateY(0); + } +} +@keyframes sidebarItem { + 0% { + transform: translateX(200px); + } + 100% { + transform: translateX(0); + } +} +:root { + --global-font-size: 14px; + --global-bg: #fff; + --font-color: #4c4948; + --hr-border: #a4d8fa; + --hr-before-color: #80c8f8; + --search-bg: #f6f8fa; + --search-input-color: #4c4948; + --search-a-color: #4c4948; + --preloader-bg: #37474f; + --preloader-color: #fff; + --tab-border-color: #f0f0f0; + --tab-botton-bg: #f0f0f0; + --tab-botton-color: #1f2d3d; + --tab-button-hover-bg: #dcdcdc; + --tab-button-active-bg: #fff; + --card-bg: #fff; + --sidebar-bg: #f6f8fa; + --btn-hover-color: #ff7242; + --btn-color: #fff; + --btn-bg: #49b1f5; + --text-bg-hover: rgba(73,177,245,0.7); + --light-grey: #eee; + --dark-grey: #cacaca; + --white: #fff; + --text-highlight-color: #1f2d3d; + --blockquote-color: #6a737d; + --blockquote-bg: rgba(73,177,245,0.1); + --reward-pop: #f5f5f5; + --toc-link-color: #666261; + --card-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); + --card-hover-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.09); + --pseudo-hover: #ff7242; + --headline-presudo: #a0a0a0; + --scrollbar-color: #49b1f5; + --default-bg-color: #49b1f5; + --zoom-bg: #fff; + --mark-bg: rgba(0,0,0,0.3); +} +body { + position: relative; + min-height: 100%; + background: var(--global-bg); + color: var(--font-color); + font-size: var(--global-font-size); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Lato, Roboto, "PingFang SC", "Microsoft JhengHei", "Microsoft YaHei", sans-serif; + line-height: 2; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +*::-webkit-scrollbar { + width: 5px; + height: 5px; +} +*::-webkit-scrollbar-thumb { + background: var(--scrollbar-color); +} +*::-webkit-scrollbar-track { + background-color: transparent; +} +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-color) transparent; +} +input::-moz-placeholder { + color: var(--font-color); +} +input:-ms-input-placeholder { + color: var(--font-color); +} +input::placeholder { + color: var(--font-color); +} +#web_bg { + position: fixed; + z-index: -999; + width: 100%; + height: 100%; + background: /images/bg-2.jpg; + background-attachment: local; + background-position: center; + background-size: cover; + background-repeat: no-repeat; +} +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + margin: 20px 0 14px; + color: var(--text-highlight-color); + font-weight: bold; +} +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit !important; +} +* { + box-sizing: border-box; +} +.table-wrap { + overflow-x: scroll; + margin: 0 0 20px; +} +table { + display: table; + width: 100%; + border-spacing: 0; + border-collapse: collapse; + empty-cells: show; +} +table thead { + background: rgba(153,169,191,0.1); +} +table th, +table td { + padding: 6px 12px; + border: 1px solid var(--light-grey); + vertical-align: middle; +} +*::-moz-selection { + background: #00c4b6; + color: #f7f7f7; +} +*::selection { + background: #00c4b6; + color: #f7f7f7; +} +button { + padding: 0; + outline: 0; + border: none; + background: none; + cursor: pointer; + -ms-touch-action: manipulation; + touch-action: manipulation; +} +a { + color: #99a9bf; + text-decoration: none; + word-wrap: break-word; + transition: all 0.2s; + overflow-wrap: break-word; +} +a:hover { + color: #49b1f5; +} +#site-title, +#site-subtitle, +.site-name, +#aside-content .author-info__name, +#aside-content .author-info__description { + font-family: Titillium Web, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft JhengHei', 'Microsoft YaHei', sans-serif; +} +.is-center { + text-align: center; +} +.pull-left { + float: left; +} +.pull-right { + float: right; +} +img[src=''], +img:not([src]) { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.img-alt { + margin: -10px 0 10px; + color: #858585; +} +.img-alt:hover { + text-decoration: none !important; +} +blockquote { + margin: 0 0 20px; + padding: 12px 15px; + border-left: 3px solid #49b1f5; + background-color: var(--blockquote-bg); + color: var(--blockquote-color); +} +blockquote footer cite:before { + padding: 0 5px; + content: '—'; +} +blockquote > :last-child { + margin-bottom: 0 !important; +} +:root { + --hl-color: #90a4ae; + --hl-bg: #f6f8fa; + --hltools-bg: #e6ebf1; + --hltools-color: #90a4ae; + --hlnumber-bg: #f6f8fa; + --hlnumber-color: rgba(144,164,174,0.5); + --hlscrollbar-bg: #dce4eb; + --hlexpand-bg: linear-gradient(180deg, rgba(246,248,250,0.6), rgba(246,248,250,0.9)); +} +[data-theme='dark'] { + --hl-color: rgba(255,255,255,0.7); + --hl-bg: #171717; + --hltools-bg: #1a1a1a; + --hltools-color: #90a4ae; + --hlnumber-bg: #171717; + --hlnumber-color: rgba(255,255,255,0.4); + --hlscrollbar-bg: #1f1f1f; + --hlexpand-bg: linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9)); +} +#article-container pre[class*='language-'].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; + line-height: 1.6; +} +#article-container pre[class*='language-'].line-numbers > code { + position: relative; + line-height: 1.6; + white-space: pre-wrap; +} +#article-container pre[class*='language-'].line-numbers .line-numbers-rows { + position: absolute; + top: 0; + left: -3.8em; + width: 3em; + letter-spacing: -1px; + font-size: 100%; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +#article-container pre[class*='language-'].line-numbers .line-numbers-rows > span { + display: block; + counter-increment: linenumber; + pointer-events: none; +} +#article-container pre[class*='language-'].line-numbers .line-numbers-rows > span:before { + display: block; + padding-right: 0.8em; + color: var(--hlnumber-color); + content: counter(linenumber); + text-align: right; +} +pre[class*='language-'] .token.function { + color: #ffb62c; +} +pre[class*='language-'] .token.comment, +pre[class*='language-'] .token.prolog, +pre[class*='language-'] .token.doctype, +pre[class*='language-'] .token.cdata { + color: rgba(149,165,166,0.8); +} +pre[class*='language-'] .token.punctuation { + color: #5e6687; +} +pre[class*='language-'] .token.namespace { + opacity: 0.7; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); +} +pre[class*='language-'] .token.operator, +pre[class*='language-'] .token.boolean, +pre[class*='language-'] .token.number { + color: #c76b29; +} +pre[class*='language-'] .token.property { + color: #c08b30; +} +pre[class*='language-'] .token.tag { + color: #3d8fd1; +} +pre[class*='language-'] .token.string { + color: #22a2c9; +} +pre[class*='language-'] .token.selector { + color: #6679cc; +} +pre[class*='language-'] .token.attr-name { + color: #c76b29; +} +pre[class*='language-'] .token.entity, +pre[class*='language-'] .token.url, +pre[class*='language-'] .language-css .token.string, +pre[class*='language-'] .style .token.string { + color: #22a2c9; +} +pre[class*='language-'] .token.attr-value, +pre[class*='language-'] .token.keyword, +pre[class*='language-'] .token.control, +pre[class*='language-'] .token.directive, +pre[class*='language-'] .token.unit { + color: #ac9739; +} +pre[class*='language-'] .token.statement, +pre[class*='language-'] .token.regex, +pre[class*='language-'] .token.atrule { + color: #22a2c9; +} +pre[class*='language-'] .token.placeholder, +pre[class*='language-'] .token.variable { + color: #3d8fd1; +} +pre[class*='language-'] .token.deleted { + text-decoration: line-through; +} +pre[class*='language-'] .token.inserted { + border-bottom: 1px dotted #202746; + text-decoration: none; +} +pre[class*='language-'] .token.italic { + font-style: italic; +} +pre[class*='language-'] .token.important, +pre[class*='language-'] .token.bold { + font-weight: bold; +} +pre[class*='language-'] .token.important { + color: #c94922; +} +pre[class*='language-'] .token.entity { + cursor: help; +} +pre[class*='language-'] pre > code.highlight { + outline: 0.4em solid #c94922; + outline-offset: 0.4em; +} +#article-container pre[class*='language-'] { + scrollbar-color: var(--hlscrollbar-bg) transparent; +} +#article-container pre[class*='language-']::-webkit-scrollbar-thumb { + background: var(--hlscrollbar-bg); +} +#article-container pre[class*='language-']:not(.line-numbers) { + padding: 10px 20px; +} +#article-container pre[class*='language-'] .caption { + margin-left: -3.8em; + padding: 4px 16px !important; +} +#article-container pre[class*='language-'] .caption a { + padding: 0 !important; +} +#article-container pre, +#article-container figure.highlight { + overflow: auto; + margin: 0 0 20px; + padding: 0; + background: var(--hl-bg); + color: var(--hl-color); + line-height: 1.6; +} +#article-container pre, +#article-container code { + font-size: var(--global-font-size); + font-family: consolas, Menlo, "PingFang SC", "Microsoft JhengHei", "Microsoft YaHei", sans-serif !important; +} +#article-container code { + padding: 2px 4px; + background: rgba(27,31,35,0.05); + color: #f47466; +} +#article-container pre { + padding: 10px 20px; +} +#article-container pre code { + padding: 0; + background: none; + color: var(--hl-color); + text-shadow: none; +} +#article-container figure.highlight { + position: relative; +} +#article-container figure.highlight pre { + margin: 0; + padding: 8px 0; + border: none; +} +#article-container figure.highlight figcaption, +#article-container figure.highlight .caption { + padding: 6px 0 2px 14px; + font-size: var(--global-font-size); + line-height: 1em; +} +#article-container figure.highlight figcaption a, +#article-container figure.highlight .caption a { + float: right; + padding-right: 10px; + color: var(--hl-color); +} +#article-container figure.highlight figcaption a:hover, +#article-container figure.highlight .caption a:hover { + border-bottom-color: var(--hl-color); +} +#article-container figure.highlight.copy-true { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + -webkit-user-select: all; +} +#article-container figure.highlight.copy-true > table, +#article-container figure.highlight.copy-true > pre { + display: block !important; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .highlight-tools { + position: relative; + display: -ms-flexbox; + display: box; + display: flex; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + overflow: hidden; + min-height: 24px; + height: 2.15em; + background: var(--hltools-bg); + color: var(--hltools-color); + font-size: var(--global-font-size); +} +#article-container .highlight-tools.closed ~ * { + display: none; +} +#article-container .highlight-tools.closed .expand { + transition: all 0.3s; + transform: rotate(-90deg) !important; +} +#article-container .highlight-tools .expand { + position: absolute; + padding: 0.57em 0.7em; + cursor: pointer; + transition: transform 0.3s; +} +#article-container .highlight-tools .expand + .code-lang { + left: 1.7em; +} +#article-container .highlight-tools .code-lang { + position: absolute; + left: 14px; + text-transform: uppercase; + font-weight: bold; + font-size: 1.15em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +#article-container .highlight-tools .copy-notice { + position: absolute; + right: 2.4em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: opacity 0.4s; +} +#article-container .highlight-tools .copy-button { + position: absolute; + right: 14px; + cursor: pointer; + transition: color 0.2s; +} +#article-container .highlight-tools .copy-button:hover { + color: #49b1f5; +} +#article-container .gutter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +#article-container .gist table { + width: auto; +} +#article-container .gist table td { + border: none; +} +#article-container figure.highlight { + margin: 0 0 24px; + border-radius: 7px; + box-shadow: 0 5px 10px 0 rgba(144,164,174,0.4); + -webkit-transform: translateZ(0); +} +#article-container figure.highlight .highlight-tools:after { + position: absolute; + left: 14px; + width: 12px; + height: 12px; + border-radius: 50%; + background: #fc625d; + box-shadow: 20px 0 #fdbc40, 40px 0 #35cd4b; + content: ' '; +} +#article-container figure.highlight .highlight-tools .expand { + right: 0; +} +#article-container figure.highlight .highlight-tools .expand.closed { + transition: all 0.3s; + transform: rotate(90deg) !important; +} +#article-container figure.highlight .highlight-tools .expand ~ .copy-notice { + right: 3.45em; +} +#article-container figure.highlight .highlight-tools .expand ~ .copy-button { + right: 2.1em; +} +#article-container figure.highlight .highlight-tools .code-lang { + left: 75px; +} +#article-container .code-expand-btn { + position: absolute; + bottom: 0; + z-index: 10; + width: 100%; + background: var(--hlexpand-bg); + text-align: center; + font-size: var(--global-font-size); + cursor: pointer; +} +#article-container .code-expand-btn i { + padding: 6px 0; + color: var(--hlnumber-color); + animation: code-expand-key 1.2s infinite; +} +#article-container .code-expand-btn.expand-done > i { + transform: rotate(180deg); +} +#article-container .code-expand-btn.expand-done + table, +#article-container .code-expand-btn.expand-done + pre { + margin-bottom: 1.8em; +} +#article-container .code-expand-btn:not(.expand-done) ~ table, +#article-container .code-expand-btn:not(.expand-done) ~ pre { + overflow: hidden; + height: 220px; +} +@keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +.error404 #error-wrap { + position: absolute; + top: 50%; + right: 0; + left: 0; + margin: 0 auto; + padding: 60px 20px 0; + max-width: 1000px; + transform: translate(0, -50%); +} +.error404 #error-wrap .error-content { + overflow: hidden; + margin: 0 20px; + height: 360px; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content { + margin: 0; + height: 500px; + } +} +.error404 #error-wrap .error-content .error-img { + display: inline-block; + overflow: hidden; + width: 50%; + height: 100%; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-img { + width: 100%; + height: 45%; + } +} +.error404 #error-wrap .error-content .error-img img { + background-color: #49b1f5; +} +.error404 #error-wrap .error-content .error-info { + display: -ms-inline-flexbox; + display: inline-box; + display: inline-flex; + -o-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; + -o-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-line-pack: center; + align-content: center; + width: 50%; + height: 100%; + vertical-align: top; + text-align: center; + font-family: Titillium Web, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft JhengHei', 'Microsoft YaHei', sans-serif; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info { + width: 100%; + height: 55%; + } +} +.error404 #error-wrap .error-content .error-info .error_title { + margin-top: -0.6em; + font-size: 9em; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info .error_title { + font-size: 8em; + } +} +.error404 #error-wrap .error-content .error-info .error_subtitle { + margin-top: -3em; + word-break: break-word; + font-size: 1.6em; + -webkit-line-clamp: 2; +} +.error404 + #rightside { + display: none; +} +.article-sort { + margin-left: 10px; + padding-left: 20px; + border-left: 2px solid #aadafa; +} +.article-sort-title { + position: relative; + margin-left: 10px; + padding-bottom: 20px; + padding-left: 20px; + font-size: 1.72em; +} +.article-sort-title:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-title:before { + position: absolute; + top: calc(((100% - 36px) / 2)); + left: -9px; + z-index: 1; + width: 10px; + height: 10px; + border: 5px solid #49b1f5; + border-radius: 10px; + background: var(--card-bg); + content: ''; + line-height: 10px; + transition: all 0.2s ease-in-out; +} +.article-sort-title:after { + position: absolute; + bottom: 0; + left: 0; + z-index: 0; + width: 2px; + height: 1.5em; + background: #aadafa; + content: ''; +} +.article-sort-item { + position: relative; + display: -ms-flexbox; + display: box; + display: flex; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0 0 20px 10px; + transition: all 0.2s ease-in-out; +} +.article-sort-item:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-item:before { + position: absolute; + left: calc(-20px - 17px); + width: 6px; + height: 6px; + border: 3px solid #49b1f5; + border-radius: 6px; + background: var(--card-bg); + content: ''; + transition: all 0.2s ease-in-out; +} +.article-sort-item.no-article-cover { + height: 80px; +} +.article-sort-item.no-article-cover .article-sort-item-info { + padding: 0; +} +.article-sort-item.year { + font-size: 1.43em; +} +.article-sort-item.year:hover:before { + border-color: #49b1f5; +} +.article-sort-item.year:before { + border-color: var(--pseudo-hover); +} +.article-sort-item-time { + color: #858585; + font-size: 95%; +} +.article-sort-item-time time { + padding-left: 6px; + cursor: default; +} +.article-sort-item-title { + color: var(--font-color); + font-size: 1.1em; + transition: all 0.3s; + -webkit-line-clamp: 2; +} +.article-sort-item-title:hover { + color: #49b1f5; + transform: translateX(10px); +} +.article-sort-item-img { + overflow: hidden; + width: 80px; + height: 80px; +} +.article-sort-item-info { + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 16px; +} +.category-lists .category-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .category-lists .category-title { + font-size: 2em; + } +} +.category-lists .category-list { + margin-bottom: 0; +} +.category-lists .category-list a { + color: var(--font-color); +} +.category-lists .category-list a:hover { + color: #49b1f5; +} +.category-lists .category-list .category-list-count { + margin-left: 8px; + color: #858585; +} +.category-lists .category-list .category-list-count:before { + content: '('; +} +.category-lists .category-list .category-list-count:after { + content: ')'; +} +.category-lists ul { + padding: 0 0 0 20px; +} +.category-lists ul ul { + padding-left: 4px; +} +.category-lists ul li { + position: relative; + margin: 6px 0; + padding: 0.12em 0.4em 0.12em 1.4em; +} +#body-wrap { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100vh; +} +.layout { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1 auto; + flex: 1 auto; + margin: 0 auto; + padding: 40px 15px; + max-width: 1200px; + width: 100%; +} +@media screen and (max-width: 900px) { + .layout { + -o-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; + } +} +@media screen and (max-width: 768px) { + .layout { + padding: 20px 5px; + } +} +@media screen and (min-width: 2000px) { + .layout { + max-width: 70%; + } +} +.layout > div:first-child:not(.recent-posts) { + align-self: flex-start; + -ms-flex-item-align: start; + padding: 50px 40px; +} +@media screen and (max-width: 768px) { + .layout > div:first-child:not(.recent-posts) { + padding: 36px 14px; + } +} +.layout > div:first-child { + width: 74%; + transition: all 0.3s; +} +@media screen and (max-width: 900px) { + .layout > div:first-child { + width: 100% !important; + } +} +@media screen and (min-width: 900px) { + .layout > div:first-child { + -o-box-ordinal-group: 2; + -ms-flex-order: 2; + order: 2; + } +} +.layout.hide-aside { + max-width: 1000px; +} +@media screen and (min-width: 2000px) { + .layout.hide-aside { + max-width: 1300px; + } +} +.layout.hide-aside > div { + width: 100% !important; +} +.apple #page-header.full_page { + background-attachment: scroll !important; +} +.apple .recent-post-item, +.apple .avatar-img, +.apple .flink-item-icon { + transform: translateZ(0); +} +#article-container .flink { + margin-bottom: 20px; +} +#article-container .flink .flink-list { + overflow: auto; + padding: 10px 10px 0; + text-align: center; +} +#article-container .flink .flink-list > .flink-list-item { + position: relative; + float: left; + overflow: hidden; + margin: 15px 7px; + width: calc(100% / 3 - 15px); + height: 90px; + border-radius: 8px; + line-height: 17px; + -webkit-transform: translateZ(0); +} +@media screen and (max-width: 1024px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(50% - 15px) !important; + } +} +@media screen and (max-width: 600px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(100% - 15px) !important; + } +} +#article-container .flink .flink-list > .flink-list-item:hover .flink-item-icon { + margin-left: -10px; + width: 0; +} +#article-container .flink .flink-list > .flink-list-item:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: var(--text-bg-hover); + content: ''; + transition: transform 0.3s ease-out; + transform: scale(0); +} +#article-container .flink .flink-list > .flink-list-item:hover:before, +#article-container .flink .flink-list > .flink-list-item:focus:before, +#article-container .flink .flink-list > .flink-list-item:active:before { + transform: scale(1); +} +#article-container .flink .flink-list > .flink-list-item a { + color: var(--font-color); + text-decoration: none; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon { + float: left; + overflow: hidden; + margin: 15px 10px; + width: 60px; + height: 60px; + border-radius: 35px; + transition: width 0.3s ease-out; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon img { + width: 100%; + height: 100%; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + -o-object-fit: cover; + object-fit: cover; +} +#article-container .flink .flink-list > .flink-list-item a .img-alt { + display: none; +} +#article-container .flink .flink-item-name { + padding: 16px 10px 0 0; + height: 40px; + font-weight: bold; + font-size: 1.43em; +} +#article-container .flink .flink-item-desc { + padding: 16px 10px 16px 0; + height: 50px; + font-size: 0.93em; +} +#article-container .flink .flink-name { + margin-bottom: 5px; + font-weight: bold; + font-size: 1.5em; +} +#recent-posts > .recent-post-item:not(:first-child) { + margin-top: 20px; +} +#recent-posts > .recent-post-item { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + overflow: hidden; + height: 16.8em; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item { + -o-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + } +} +#recent-posts > .recent-post-item:hover img.post-bg { + transform: scale(1.1); +} +#recent-posts > .recent-post-item.ads-wrap { + display: block !important; + height: auto !important; +} +#recent-posts > .recent-post-item .post_cover { + overflow: hidden; + width: 42%; + height: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover { + width: 100%; + height: 230px; + } +} +#recent-posts > .recent-post-item .post_cover.right { + -o-box-ordinal-group: 1; + -ms-flex-order: 1; + order: 1; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover.right { + -o-box-ordinal-group: 0; + -ms-flex-order: 0; + order: 0; + } +} +#recent-posts > .recent-post-item >.recent-post-info { + padding: 0 40px; + width: 58%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info { + padding: 20px 20px 30px; + width: 100%; + } +} +#recent-posts > .recent-post-item >.recent-post-info.no-cover { + width: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info.no-cover { + padding: 30px 20px; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title { + color: var(--text-highlight-color); + font-size: 1.55em; + line-height: 1.4; + transition: all 0.2s ease-in-out; + -webkit-line-clamp: 2; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title .sticky { + margin-right: 10px; + color: #ff7242; + transform: rotate(45deg); +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info > .article-title { + font-size: 1.43em; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title:hover { + color: #49b1f5; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap { + margin: 6px 0; + color: #858585; + font-size: 0.9em; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap > .post-meta-date { + cursor: default; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap i { + margin: 0 4px 0 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .fa-spinner { + margin: 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-label { + padding-right: 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-separator { + margin: 0 6px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-link { + margin: 0 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a { + color: #858585; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a:hover { + color: #49b1f5; + text-decoration: underline; +} +#recent-posts > .recent-post-item >.recent-post-info > .content { + -webkit-line-clamp: 2; +} +.tag-cloud-list a { + display: inline-block; + padding: 0 8px; + transition: all 0.3s; +} +.tag-cloud-list a:hover { + color: #49b1f5 !important; + transform: scale(1.1); +} +@media screen and (max-width: 768px) { + .tag-cloud-list a { + zoom: 0.85; + } +} +.tag-cloud-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .tag-cloud-title { + font-size: 2em; + } +} +h1.page-title + .tag-cloud-list { + text-align: left; +} +#aside-content { + width: 26%; +} +@media screen and (min-width: 900px) { + #aside-content { + padding-right: 15px; + } +} +@media screen and (max-width: 900px) { + #aside-content { + width: 100%; + } +} +#aside-content > .card-widget:first-child { + margin-top: 0; +} +@media screen and (max-width: 900px) { + #aside-content > .card-widget:first-child { + margin-top: 20px; + } +} +#aside-content .card-widget { + position: relative; + overflow: hidden; + margin-top: 20px; + padding: 20px 24px; +} +#aside-content .card-info .author-info__name { + font-weight: 500; + font-size: 1.57em; +} +#aside-content .card-info .author-info__description { + margin-top: -0.42em; +} +#aside-content .card-info .card-info-data { + margin: 14px 0 4px; +} +#aside-content .card-info .card-info-social-icons { + margin: 6px 0 -6px; +} +#aside-content .card-info .card-info-social-icons .social-icon { + margin: 0 10px; + color: var(--font-color); + font-size: 1.4em; +} +#aside-content .card-info .card-info-social-icons i { + transition: all 0.3s; +} +#aside-content .card-info .card-info-social-icons i:hover { + transform: rotate(360deg); +} +#aside-content .card-info #card-info-btn { + display: block; + margin-top: 14px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + line-height: 2.4; +} +#aside-content .card-info #card-info-btn:hover { + background-color: var(--btn-hover-color); +} +#aside-content .card-info #card-info-btn span { + padding-left: 10px; +} +#aside-content .item-headline { + padding-bottom: 6px; + font-size: 1.2em; +} +#aside-content .item-headline span { + margin-left: 6px; +} +@media screen and (min-width: 900px) { + #aside-content .sticky_layout { + position: sticky; + position: -webkit-sticky; + top: 20px; + transition: top 0.3s; + } +} +#aside-content .card-tag-cloud a { + display: inline-block; + padding: 0 4px; +} +#aside-content .card-tag-cloud a:hover { + color: #49b1f5 !important; +} +#aside-content .aside-list > span { + display: block; + margin-bottom: 10px; + text-align: center; +} +#aside-content .aside-list > .aside-list-item { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 6px 0; +} +#aside-content .aside-list > .aside-list-item:first-child { + padding-top: 0; +} +#aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed #f5f5f5; +} +#aside-content .aside-list > .aside-list-item:last-child { + padding-bottom: 0; +} +#aside-content .aside-list > .aside-list-item .thumbnail { + overflow: hidden; + width: 4.2em; + height: 4.2em; +} +#aside-content .aside-list > .aside-list-item .content { + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1; + flex: 1; + padding-left: 10px; + word-break: break-all; +} +#aside-content .aside-list > .aside-list-item .content > .name { + -webkit-line-clamp: 1; +} +#aside-content .aside-list > .aside-list-item .content > time, +#aside-content .aside-list > .aside-list-item .content > .name { + display: block; + color: #858585; + font-size: 85%; +} +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment { + color: var(--font-color); + font-size: 95%; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#aside-content .aside-list > .aside-list-item .content > .title:hover, +#aside-content .aside-list > .aside-list-item .content > .comment:hover { + color: #49b1f5; +} +#aside-content .aside-list > .aside-list-item.no-cover { + min-height: 4.4em; +} +#aside-content .card-archives ul.card-archive-list, +#aside-content .card-categories ul.card-category-list { + margin: 0; + padding: 0; + list-style: none; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; + padding: 3px 10px; + color: var(--font-color); + transition: all 0.4s; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover { + padding: 3px 17px; + background-color: var(--text-bg-hover); +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child { + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1; + flex: 1; +} +#aside-content .card-categories .card-category-list.child { + padding: 0 0 0 16px; +} +#aside-content .card-categories .card-category-list > .parent > a.expand i { + transform: rotate(-90deg); +} +#aside-content .card-categories .card-category-list > .parent > a.expand + .child { + display: block; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-name { + width: 70% !important; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-count { + width: calc(100% - 70% - 20px); + text-align: right; +} +#aside-content .card-categories .card-category-list > .parent > a i { + float: right; + margin-right: -0.5em; + padding: 0.5em; + transition: transform 0.3s; + transform: rotate(0); +} +#aside-content .card-categories .card-category-list > .parent > .child { + display: none; +} +#aside-content .card-webinfo .webinfo .webinfo-item { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 2px 10px 0; +} +#aside-content .card-webinfo .webinfo .webinfo-item div:first-child { + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 20px; +} +@media screen and (min-width: 901px) { + #aside-content #card-toc { + right: 0 !important; + } +} +@media screen and (max-width: 900px) { + #aside-content #card-toc { + position: fixed; + right: 55px; + bottom: 30px; + z-index: 100; + max-width: 380px; + max-height: calc(100% - 60px); + width: calc(100% - 80px); + transition: none; + transform: scale(0); + transform-origin: right bottom; + } + #aside-content #card-toc.open { + transform: scale(1); + } +} +#aside-content #card-toc .toc-percentage { + float: right; + margin-top: -9px; + color: #a9a9a9; + font-style: italic; + font-size: 140%; +} +#aside-content #card-toc .toc-content { + overflow-y: scroll; + overflow-y: overlay; + margin: 0 -24px; + max-height: calc(100vh - 120px); + width: calc(100% + 48px); +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content { + max-height: calc(100vh - 140px); + } +} +#aside-content #card-toc .toc-content > * { + margin: 0 20px !important; +} +#aside-content #card-toc .toc-content > * > .toc-item > .toc-child { + margin-left: 10px; + padding-left: 10px; + border-left: 1px solid var(--dark-grey); +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: none; +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: block !important; + } +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child { + display: block; +} +#aside-content #card-toc .toc-content ol, +#aside-content #card-toc .toc-content li { + list-style: none; +} +#aside-content #card-toc .toc-content > ol { + padding: 0 !important; +} +#aside-content #card-toc .toc-content ol { + margin: 0; + padding-left: 18px; +} +#aside-content #card-toc .toc-content .toc-link { + display: block; + margin: 4px 0; + padding: 1px 6px; + color: var(--toc-link-color); + transition: all 0.2s ease-in-out; +} +#aside-content #card-toc .toc-content .toc-link:hover { + color: #49b1f5; +} +#aside-content #card-toc .toc-content .toc-link.active { + background: #00c4b6; + color: #fff; +} +#aside-content .sticky_layout:only-child > :first-child { + margin-top: 0; +} +#aside-content .card-more-btn { + float: right; + color: inherit; +} +#aside-content .card-more-btn:hover { + animation: more-btn-move 1s infinite; +} +#aside-content .card-announcement .item-headline i { + color: #f00; +} +.avatar-img { + overflow: hidden; + margin: 0 auto; + width: 110px; + height: 110px; + border-radius: 70px; +} +.avatar-img img { + width: 100%; + height: 100%; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + -o-object-fit: cover; + object-fit: cover; +} +.avatar-img img:hover { + transform: rotate(360deg); +} +.site-data { + display: table; + width: 100%; + table-layout: fixed; +} +.site-data > a { + display: table-cell; +} +.site-data > a div { + transition: all 0.3s; +} +.site-data > a:hover div { + color: #49b1f5 !important; +} +.site-data > a .headline { + color: var(--font-color); +} +.site-data > a .length-num { + margin-top: -0.32em; + color: var(--text-highlight-color); + font-size: 1.4em; +} +@media screen and (min-width: 900px) { + html.hide-aside .layout { + -o-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + } + html.hide-aside .layout > .aside-content { + display: none; + } + html.hide-aside .layout > div:first-child { + width: 80%; + } +} +.page .sticky_layout { + display: -ms-flexbox; + display: box; + display: flex; + -o-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; +} +@keyframes more-btn-move { + 0%, 100% { + transform: translateX(0); + } + 50% { + transform: translateX(3px); + } +} +@keyframes toc-open { + 0% { + transform: scale(0.7); + } + 100% { + transform: scale(1); + } +} +@keyframes toc-close { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.7); + } +} +#post-comment .comment-head { + margin-bottom: 20px; +} +#post-comment .comment-head:after { + display: block; + clear: both; + content: ''; +} +#post-comment .comment-head .comment-headline { + display: inline-block; + vertical-align: middle; + font-weight: 700; + font-size: 1.43em; +} +#post-comment .comment-head .comment-switch { + display: inline-block; + float: right; + margin: 2px auto 0; + padding: 4px 16px; + width: -moz-max-content; + width: max-content; + border-radius: 8px; + background: #f6f8fa; +} +#post-comment .comment-head .comment-switch .first-comment { + color: #49b1f5; +} +#post-comment .comment-head .comment-switch .second-comment { + color: #ff7242; +} +#post-comment .comment-head .comment-switch #switch-btn { + position: relative; + display: inline-block; + margin: -4px 8px 0; + width: 42px; + height: 22px; + border-radius: 34px; + background-color: #49b1f5; + vertical-align: middle; + cursor: pointer; + transition: 0.4s; +} +#post-comment .comment-head .comment-switch #switch-btn:before { + position: absolute; + bottom: 4px; + left: 4px; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: #fff; + content: ''; + transition: 0.4s; +} +#post-comment .comment-wrap > div { + animation: tabshow 0.5s; +} +#post-comment .comment-wrap > div:nth-child(2) { + display: none; +} +#post-comment.move #switch-btn { + background-color: #ff7242; +} +#post-comment.move #switch-btn:before { + transform: translateX(20px); +} +#post-comment.move .comment-wrap > div:first-child { + display: none; +} +#post-comment.move .comment-wrap > div:last-child { + display: block; +} +#footer { + position: relative; + background-color: #49b1f5; + background-attachment: scroll; + background-position: bottom; + background-size: cover; +} +#footer:before { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--mark-bg); + content: ''; +} +#footer-wrap { + position: relative; + padding: 40px 20px; + color: var(--light-grey); + text-align: center; +} +#footer-wrap a { + color: var(--light-grey); +} +#footer-wrap a:hover { + text-decoration: underline; +} +#footer-wrap .footer-separator { + margin: 0 4px; +} +#footer-wrap .icp-icon { + padding: 0 4px; + max-height: 1.4em; + width: auto; + vertical-align: text-bottom; +} +#page-header { + position: relative; + width: 100%; + background-color: #49b1f5; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + transition: all 0.5s; +} +#page-header:not(.not-top-img):before { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--mark-bg); + content: ''; +} +#page-header.full_page { + height: 100vh; + background-attachment: fixed; +} +#page-header.full_page #site-info { + position: absolute; + top: 43%; + padding: 0 10px; + width: 100%; +} +#page-header #site-title, +#page-header #site-subtitle, +#page-header #scroll-down .scroll-down-effects { + text-align: center; + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + line-height: 1.5; +} +#page-header #site-title { + margin: 0; + color: var(--white); + font-size: 1.85em; +} +@media screen and (min-width: 768px) { + #page-header #site-title { + font-size: 2.85em; + } +} +#page-header #site-subtitle { + color: var(--light-grey); + font-size: 1.15em; +} +@media screen and (min-width: 768px) { + #page-header #site-subtitle { + font-size: 1.72em; + } +} +#page-header #site_social_icons { + display: none; + margin: 0 auto; + text-align: center; +} +@media screen and (max-width: 768px) { + #page-header #site_social_icons { + display: block; + } +} +#page-header #site_social_icons .social-icon { + margin: 0 10px; + color: var(--light-grey); + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-size: 1.43em; +} +#page-header #scroll-down { + position: absolute; + bottom: 10px; + width: 100%; + cursor: pointer; +} +#page-header #scroll-down .scroll-down-effects { + position: relative; + width: 100%; + color: var(--light-grey); + font-size: 20px; +} +#page-header.not-home-page { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.not-home-page { + height: 280px; + } +} +#page-header #page-site-info { + position: absolute; + top: 200px; + padding: 0 10px; + width: 100%; +} +@media screen and (max-width: 768px) { + #page-header #page-site-info { + top: 140px; + } +} +#page-header.post-bg { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.post-bg { + height: 360px; + } +} +#page-header #post-info { + position: absolute; + bottom: 100px; + padding: 0 8%; + width: 100%; + text-align: center; +} +@media screen and (max-width: 900px) { + #page-header #post-info { + bottom: 30px; + text-align: left; + } +} +@media screen and (max-width: 768px) { + #page-header #post-info { + bottom: 22px; + padding: 0 22px; + } +} +#page-header.not-top-img { + margin-bottom: 10px; + height: 60px; + background: 0; +} +#page-header.not-top-img #nav { + background: rgba(255,255,255,0.8); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); +} +#page-header.not-top-img #nav a, +#page-header.not-top-img #nav .site-name { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav { + position: fixed; + top: -60px; + z-index: 91; + background: rgba(255,255,255,0.8); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; +} +#page-header.nav-fixed #nav #blog-info { + color: var(--font-color); +} +#page-header.nav-fixed #nav #blog-info:hover { + color: #49b1f5; +} +#page-header.nav-fixed #nav #blog-info .site-name { + text-shadow: none; +} +#page-header.nav-fixed #nav a, +#page-header.nav-fixed #nav #toggle-menu { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav a:hover, +#page-header.nav-fixed #nav #toggle-menu:hover { + color: #49b1f5; +} +#page-header.nav-fixed.fixed #nav { + top: 0; + transition: all 0.5s; +} +#page-header.nav-visible:not(.fixed) #nav { + transition: all 0.5s; + transform: translate3d(0, 100%, 0); +} +#page-header.nav-visible:not(.fixed) + .layout > .aside-content > .sticky_layout { + top: 70px; + transition: top 0.5s; +} +#page-header.fixed #nav { + position: fixed; +} +#page-header.fixed + .layout > .aside-content > .sticky_layout { + top: 70px; + transition: top 0.5s; +} +#page-header.fixed + .layout #card-toc .toc-content { + max-height: calc(100vh - 170px); +} +#page h1.page-title { + margin: 8px 0 20px; +} +#post > #post-info { + margin-bottom: 30px; +} +#post > #post-info .post-title { + padding-bottom: 4px; + border-bottom: 1px solid var(--light-grey); + color: var(--text-highlight-color); +} +#post > #post-info .post-title .post-edit-link { + float: right; +} +#post > #post-info #post-meta, +#post > #post-info #post-meta a { + color: #78818a; +} +#post-info .post-title { + margin-bottom: 8px; + color: var(--white); + font-weight: normal; + font-size: 2.5em; + line-height: 1.5; + -webkit-line-clamp: 3; +} +@media screen and (max-width: 768px) { + #post-info .post-title { + font-size: 2.1em; + } +} +#post-info .post-title .post-edit-link { + padding-left: 10px; +} +#post-info #post-meta { + color: var(--light-grey); + font-size: 95%; +} +@media screen and (min-width: 768px) { + #post-info #post-meta > .meta-secondline > span:first-child { + display: none; + } +} +@media screen and (max-width: 768px) { + #post-info #post-meta { + font-size: 90%; + } + #post-info #post-meta > .meta-firstline, + #post-info #post-meta > .meta-secondline { + display: inline; + } +} +#post-info #post-meta .post-meta-separator { + margin: 0 5px; +} +#post-info #post-meta .post-meta-icon { + margin-right: 4px; +} +#post-info #post-meta .post-meta-label { + margin-right: 4px; +} +#post-info #post-meta a { + color: var(--light-grey); + transition: all 0.3s ease-out; +} +#post-info #post-meta a:hover { + color: #49b1f5; + text-decoration: underline; +} +#nav { + position: absolute; + top: 0; + z-index: 90; + display: -ms-flexbox; + display: box; + display: flex; + -o-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0 36px; + width: 100%; + height: 60px; + font-size: 1.3em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: all 0.5s; +} +@media screen and (max-width: 768px) { + #nav { + padding: 0 16px; + } +} +#nav.show { + opacity: 1; + -ms-filter: none; + filter: none; +} +#nav #blog-info { + -o-box-flex: 1; + box-flex: 1; + -ms-flex: 1; + flex: 1; + color: var(--light-grey); +} +#nav #blog-info .site-icon { + margin-right: 6px; + height: 36px; + vertical-align: middle; +} +#nav #toggle-menu { + display: none; + padding: 2px 0 0 6px; + vertical-align: top; +} +#nav #toggle-menu:hover { + color: var(--white); +} +#nav a { + color: var(--light-grey); +} +#nav a:hover { + color: var(--white); +} +#nav .site-name { + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-weight: bold; +} +#nav .menus_items { + display: inline; +} +#nav .menus_items .menus_item { + position: relative; + display: inline-block; + padding: 0 0 0 14px; +} +#nav .menus_items .menus_item:hover .menus_item_child { + display: block; +} +#nav .menus_items .menus_item:hover > a > i:last-child { + transform: rotate(180deg); +} +#nav .menus_items .menus_item > a > i:last-child { + padding: 4px; + transition: transform 0.3s; +} +#nav .menus_items .menus_item .menus_item_child { + position: absolute; + right: 0; + display: none; + margin-top: 8px; + padding: 0; + width: -moz-max-content; + width: max-content; + border-radius: 5px; + background-color: var(--sidebar-bg); + box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + animation: sub_menus 0.3s 0.1s ease both; +} +#nav .menus_items .menus_item .menus_item_child:before { + position: absolute; + top: -8px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +#nav .menus_items .menus_item .menus_item_child li { + list-style: none; +} +#nav .menus_items .menus_item .menus_item_child li:hover { + background: var(--text-bg-hover); +} +#nav .menus_items .menus_item .menus_item_child li:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li a { + display: inline-block; + padding: 8px 16px; + width: 100%; + color: var(--font-color) !important; + text-shadow: none !important; +} +#nav.hide-menu #toggle-menu { + display: inline-block !important; +} +#nav.hide-menu #toggle-menu .site-page { + font-size: inherit; +} +#nav.hide-menu .menus_items { + display: none; +} +#nav.hide-menu #search-button span { + display: none; +} +#nav #search-button { + display: inline; + padding: 0 0 0 14px; +} +#nav .site-page { + position: relative; + padding-bottom: 6px; + text-shadow: 1px 1px 2px rgba(0,0,0,0.3); + font-size: 0.78em; + cursor: pointer; +} +#nav .site-page:not(.child):after { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + width: 0; + height: 3px; + background-color: #80c8f8; + content: ''; + transition: all 0.3s ease-in-out; +} +#nav .site-page:not(.child):hover:after { + width: 100%; +} +#pagination .pagination { + margin-top: 20px; + text-align: center; +} +#pagination .page-number.current { + background: #00c4b6; + color: var(--white); +} +#pagination .pagination-info { + position: absolute; + top: 50%; + padding: 20px 40px; + width: 100%; + transform: translate(0, -50%); +} +#pagination .prev_info, +#pagination .next_info { + color: var(--white); + font-weight: 500; +} +#pagination .next-post .pagination-info { + text-align: right; +} +#pagination .pull-full { + width: 100% !important; +} +#pagination .prev-post .label, +#pagination .next-post .label { + color: var(--light-grey); + text-transform: uppercase; + font-size: 90%; +} +#pagination .prev-post, +#pagination .next-post { + width: 50%; +} +@media screen and (max-width: 768px) { + #pagination .prev-post, + #pagination .next-post { + width: 100%; + } +} +#pagination .prev-post a, +#pagination .next-post a { + position: relative; + display: block; + overflow: hidden; + height: 150px; +} +#pagination.pagination-post { + overflow: hidden; + margin-top: 40px; + width: 100%; + background: #000; +} +.layout > .recent-posts .pagination > * { + display: inline-block; + margin: 0 6px; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; +} +.layout > .recent-posts .pagination > *:not(.space):hover { + background: var(--btn-hover-color); + color: var(--btn-color); +} +.layout > div:not(.recent-posts) .pagination .page-number { + display: inline-block; + margin: 0 4px; + min-width: 24px; + height: 24px; + text-align: center; + line-height: 24px; + cursor: pointer; +} +#article-container { + word-wrap: break-word; + overflow-wrap: break-word; +} +#article-container a { + color: #49b1f5; +} +#article-container a:hover { + text-decoration: underline; +} +#article-container img { + display: block; + margin: 0 auto 20px; + max-width: 100%; + transition: filter 375ms ease-in 0.2s; +} +#article-container p { + margin: 0 0 16px; +} +#article-container iframe { + margin: 0 0 20px; +} +#article-container kbd { + margin: 0 3px; + padding: 3px 5px; + border: 1px solid #b4b4b4; + border-radius: 3px; + background-color: #f8f8f8; + box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + color: #34495e; + white-space: nowrap; + font-weight: 600; + font-size: 0.9em; + font-family: Monaco, 'Ubuntu Mono', monospace; + line-height: 1em; +} +#article-container a.headerlink { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + height: 100%; +} +#article-container ol ol, +#article-container ul ol, +#article-container ol ul, +#article-container ul ul { + padding-left: 20px; +} +#article-container ol li, +#article-container ul li { + margin: 4px 0; +} +#article-container ol p, +#article-container ul p { + margin: 0 0 8px; +} +#article-container > :last-child { + margin-bottom: 0 !important; +} +#article-container hr { + margin: 20px 0; +} +#article-container.post-content h1, +#article-container.post-content h2, +#article-container.post-content h3, +#article-container.post-content h4, +#article-container.post-content h5, +#article-container.post-content h6 { + transition: all 0.2s ease-out; +} +#article-container.post-content h1:before, +#article-container.post-content h2:before, +#article-container.post-content h3:before, +#article-container.post-content h4:before, +#article-container.post-content h5:before, +#article-container.post-content h6:before { + position: absolute; + top: calc(50% - 7px); + color: #f47466; + content: '\f0c1'; + left: 0; + line-height: 1; + transition: all 0.2s ease-out; +} +#article-container.post-content h1:hover:before, +#article-container.post-content h2:hover:before, +#article-container.post-content h3:hover:before, +#article-container.post-content h4:hover:before, +#article-container.post-content h5:hover:before, +#article-container.post-content h6:hover:before { + color: #49b1f5; +} +#article-container.post-content h1 { + padding-left: 28px; +} +#article-container.post-content h1:before { + font-size: 18px; +} +#article-container.post-content h1:hover { + padding-left: 32px; +} +#article-container.post-content h2 { + padding-left: 26px; +} +#article-container.post-content h2:before { + font-size: 16px; +} +#article-container.post-content h2:hover { + padding-left: 30px; +} +#article-container.post-content h3 { + padding-left: 24px; +} +#article-container.post-content h3:before { + font-size: 14px; +} +#article-container.post-content h3:hover { + padding-left: 28px; +} +#article-container.post-content h4 { + padding-left: 22px; +} +#article-container.post-content h4:before { + font-size: 12px; +} +#article-container.post-content h4:hover { + padding-left: 26px; +} +#article-container.post-content h5 { + padding-left: 20px; +} +#article-container.post-content h5:before { + font-size: 10px; +} +#article-container.post-content h5:hover { + padding-left: 24px; +} +#article-container.post-content h6 { + padding-left: 20px; +} +#article-container.post-content h6:before { + font-size: 10px; +} +#article-container.post-content h6:hover { + padding-left: 24px; +} +#article-container.post-content ol p, +#article-container.post-content ul p { + margin: 0 0 8px; +} +#article-container.post-content li::marker { + color: #49b1f5; + font-weight: 600; + font-size: 1.05em; +} +#article-container.post-content li:hover::marker { + color: var(--pseudo-hover); +} +#article-container.post-content ul > li { + list-style-type: circle; +} +#post .tag_share:after { + display: block; + clear: both; + content: ''; +} +#post .tag_share .post-meta__tag-list { + display: inline-block; +} +#post .tag_share .post-meta__tags { + display: inline-block; + margin: 8px 8px 8px 0; + padding: 0 12px; + width: -moz-fit-content; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + transition: all 0.2s ease-in-out; +} +#post .tag_share .post-meta__tags:hover { + background: #49b1f5; + color: var(--white); +} +#post .tag_share .post_share { + display: inline-block; + float: right; + margin: 8px 0 0; + width: -moz-fit-content; + width: fit-content; +} +#post .tag_share .post_share .social-share { + font-size: 0.85em; +} +#post .tag_share .post_share .social-share .social-share-icon { + margin: 0 4px; + width: 1.85em; + height: 1.85em; + font-size: 1.2em; + line-height: 1.85em; +} +#post .post-copyright { + position: relative; + margin: 40px 0 10px; + padding: 10px 16px; + border: 1px solid var(--light-grey); + transition: box-shadow 0.3s ease-in-out; +} +#post .post-copyright:before { + position: absolute; + top: 2px; + right: 12px; + color: #49b1f5; + content: '\f1f9'; + font-size: 1.3em; +} +#post .post-copyright:hover { + box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); +} +#post .post-copyright .post-copyright-meta { + color: #49b1f5; + font-weight: bold; +} +#post .post-copyright .post-copyright-meta i { + margin-right: 3px; +} +#post .post-copyright .post-copyright-info { + padding-left: 6px; +} +#post .post-copyright .post-copyright-info a { + text-decoration: underline; + word-break: break-word; +} +#post .post-copyright .post-copyright-info a:hover { + text-decoration: none; +} +#post .post-outdate-notice { + position: relative; + margin: 0 0 20px; + padding: 0.5em 1.2em; + border-radius: 3px; + background-color: #ffe6e6; + color: #f66; + padding: 0.5em 1em 0.5em 2.6em; + border-left: 5px solid #ff8080; +} +#post .post-outdate-notice:before { + position: absolute; + top: 50%; + left: 0.9em; + color: #ff8080; + content: '\f071'; + transform: translateY(-50%); +} +#post .ads-wrap { + margin: 40px 0; +} +.relatedPosts { + margin-top: 40px; +} +.relatedPosts > .headline { + margin-bottom: 5px; + font-weight: 700; + font-size: 1.43em; +} +.relatedPosts > .relatedPosts-list > div { + position: relative; + display: inline-block; + overflow: hidden; + margin: 3px; + width: calc(33.333% - 6px); + height: 200px; + background: #000; + vertical-align: bottom; +} +@media screen and (max-width: 768px) { + .relatedPosts > .relatedPosts-list > div { + margin: 2px; + width: calc(50% - 4px); + height: 150px; + } +} +@media screen and (max-width: 600px) { + .relatedPosts > .relatedPosts-list > div { + width: calc(100% - 4px); + } +} +.relatedPosts > .relatedPosts-list .content { + position: absolute; + top: 50%; + padding: 0 20px; + width: 100%; + transform: translate(0, -50%); +} +.relatedPosts > .relatedPosts-list .content .date { + color: var(--light-grey); + font-size: 90%; +} +.relatedPosts > .relatedPosts-list .content .title { + color: var(--white); + -webkit-line-clamp: 2; +} +.post-reward { + position: relative; + margin-top: 80px; + width: 100%; + text-align: center; + pointer-events: none; +} +.post-reward > * { + pointer-events: auto; +} +.post-reward .reward-button { + display: inline-block; + padding: 4px 24px; + background: var(--btn-bg); + color: var(--btn-color); + cursor: pointer; +} +.post-reward .reward-button i { + margin-right: 5px; +} +.post-reward:hover .reward-button { + background: var(--btn-hover-color); +} +.post-reward:hover > .reward-main { + display: block; +} +.post-reward .reward-main { + position: absolute; + bottom: 40px; + left: 0; + z-index: 100; + display: none; + padding: 0 0 15px; + width: 100%; +} +.post-reward .reward-main .reward-all { + display: inline-block; + margin: 0; + padding: 20px 10px; + border-radius: 4px; + background: var(--reward-pop); +} +.post-reward .reward-main .reward-all:before { + position: absolute; + bottom: -10px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +.post-reward .reward-main .reward-all:after { + position: absolute; + right: 0; + bottom: 2px; + left: 0; + margin: 0 auto; + width: 0; + height: 0; + border-top: 13px solid var(--reward-pop); + border-right: 13px solid transparent; + border-left: 13px solid transparent; + content: ''; +} +.post-reward .reward-main .reward-all .reward-item { + display: inline-block; + padding: 0 8px; + list-style-type: none; + vertical-align: top; +} +.post-reward .reward-main .reward-all .reward-item img { + width: 130px; + height: 130px; +} +.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc { + width: 130px; + color: #858585; +} +#rightside { + position: fixed; + right: -48px; + bottom: 40px; + z-index: 100; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: all 0.5s; +} +#rightside.rightside-show { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + transform: translate(-58px, 0); +} +#rightside #rightside-config-hide { + height: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: transform 0.4s; + transform: translate(45px, 0); +} +#rightside #rightside-config-hide.show { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; + transform: translate(0, 0); +} +#rightside #rightside-config-hide.status { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; +} +#rightside > div > button, +#rightside > div > a { + display: block; + margin-bottom: 5px; + width: 35px; + height: 35px; + border-radius: 5px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + font-size: 16px; + line-height: 35px; +} +#rightside > div > button:hover, +#rightside > div > a:hover { + background-color: var(--btn-hover-color); +} +#rightside #mobile-toc-button { + display: none; +} +@media screen and (max-width: 900px) { + #rightside #mobile-toc-button { + display: block; + } +} +@media screen and (max-width: 900px) { + #rightside #hide-aside-btn { + display: none; + } +} +#rightside #go-up .scroll-percent { + display: none; +} +#rightside #go-up.show-percent .scroll-percent { + display: block; +} +#rightside #go-up.show-percent .scroll-percent + i { + display: none; +} +#rightside #go-up:hover .scroll-percent { + display: none; +} +#rightside #go-up:hover .scroll-percent + i { + display: block; +} +#sidebar #menu-mask { + position: fixed; + z-index: 102; + display: none; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.8); +} +#sidebar #sidebar-menus { + position: fixed; + top: 0; + right: -300px; + z-index: 103; + overflow-x: hidden; + overflow-y: scroll; + padding-left: 5px; + width: 300px; + height: 100%; + background: var(--sidebar-bg); + transition: all 0.5s; +} +#sidebar #sidebar-menus.open { + transform: translate3d(-100%, 0, 0); +} +#sidebar #sidebar-menus > .avatar-img { + margin: 20px auto; +} +#sidebar #sidebar-menus .sidebar-site-data { + padding: 0 10px; +} +#sidebar #sidebar-menus hr { + margin: 20px auto; +} +#sidebar #sidebar-menus .menus_items { + padding: 0 5px; +} +#sidebar #sidebar-menus .menus_items .site-page { + position: relative; + display: block; + padding: 6px 30px 6px 22px; + color: var(--font-color); + font-size: 1.15em; +} +#sidebar #sidebar-menus .menus_items .site-page:hover { + background: var(--text-bg-hover); +} +#sidebar #sidebar-menus .menus_items .site-page i:first-child { + width: 15%; + text-align: left; +} +#sidebar #sidebar-menus .menus_items .site-page.group > i:last-child { + position: absolute; + top: 0.78em; + right: 13px; + transition: transform 0.3s; +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide > i:last-child { + transform: rotate(90deg); +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide + .menus_item_child { + display: none; +} +#sidebar #sidebar-menus .menus_items .menus_item_child { + margin: 0; + padding-left: 25px; + list-style: none; +} +#vcomment { + font-size: 1.1em; +} +#vcomment .vbtn { + border: none; + background: var(--btn-bg); + color: var(--btn-color); +} +#vcomment .vbtn:hover { + background: var(--btn-hover-color); +} +#vcomment .vimg { + transition: all 0.3s; +} +#vcomment .vimg:hover { + transform: rotate(360deg); +} +#vcomment .vcards .vcard .vcontent.expand:before, +#vcomment .vcards .vcard .vcontent.expand:after { + z-index: 22; +} +#waline-wrap { + --waline-font-size: 1.1em; + --waline-theme-color: #49b1f5; + --waline-active-color: #ff7242; +} +#waline-wrap .wl-comment-actions > button:not(last-child) { + padding-right: 4px; +} +.fireworks { + position: fixed; + top: 0; + left: 0; + z-index: 9999; + pointer-events: none; +} +.medium-zoom-image--opened { + z-index: 99999 !important; + margin: 0 !important; +} +.medium-zoom-overlay { + z-index: 99999 !important; +} +.mermaid-wrap { + margin: 0 0 20px; + text-align: center; +} +.mermaid-wrap > svg { + height: 100%; +} +.utterances, +.fb-comments iframe { + width: 100% !important; +} +#gitalk-container .gt-meta { + margin: 0 0 0.8em; + padding: 6px 0 16px; +} +.katex-wrap { + overflow: auto; +} +.katex-wrap::-webkit-scrollbar { + display: none; +} +mjx-container { + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 4px; + max-width: 100%; +} +mjx-container[display] { + display: block !important; + min-width: auto !important; +} +mjx-container:not([display]) { + display: inline-grid !important; +} +mjx-assistive-mml { + right: 0; + bottom: 0; +} +.aplayer { + color: #4c4948; +} +#article-container .aplayer { + margin: 0 0 20px; +} +#article-container .aplayer ol, +#article-container .aplayer ul { + margin: 0; + padding: 0; +} +#article-container .aplayer ol li, +#article-container .aplayer ul li { + margin: 0; + padding: 0 15px; +} +#article-container .aplayer ol li:before, +#article-container .aplayer ul li:before { + content: none; +} +.snackbar-css { + border-radius: 5px !important; +} +.abc-music-sheet { + margin: 0 0 20px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: opacity 0.3s; +} +.abc-music-sheet.abcjs-container { + opacity: 1; + -ms-filter: none; + filter: none; +} +@media screen and (max-width: 768px) { + .fancybox__toolbar__column.is-middle { + display: none; + } +} +#article-container .btn-center { + margin: 0 0 20px; + text-align: center; +} +#article-container .btn-beautify { + display: inline-block; + margin: 0 4px 6px; + padding: 0 15px; + background-color: var(--btn-beautify-color, #777); + color: #fff; + line-height: 2; +} +#article-container .btn-beautify.blue { + --btn-beautify-color: #428bca; +} +#article-container .btn-beautify.pink { + --btn-beautify-color: #ff69b4; +} +#article-container .btn-beautify.red { + --btn-beautify-color: #f00; +} +#article-container .btn-beautify.purple { + --btn-beautify-color: #6f42c1; +} +#article-container .btn-beautify.orange { + --btn-beautify-color: #ff8c00; +} +#article-container .btn-beautify.green { + --btn-beautify-color: #5cb85c; +} +#article-container .btn-beautify:hover { + background-color: var(--btn-hover-color); +} +#article-container .btn-beautify i + span { + margin-left: 6px; +} +#article-container .btn-beautify:not(.block) + .btn-beautify:not(.block) { + margin: 0 4px 20px; +} +#article-container .btn-beautify.block { + display: block; + margin: 0 0 20px; + width: fit-content; + width: -moz-fit-content; +} +#article-container .btn-beautify.block.center { + margin: 0 auto 20px; +} +#article-container .btn-beautify.block.right { + margin: 0 0 20px auto; +} +#article-container .btn-beautify.larger { + padding: 6px 15px; +} +#article-container .btn-beautify:hover { + text-decoration: none; +} +#article-container .btn-beautify.outline { + border: 1px solid transparent; + border-color: var(--btn-beautify-color, #777); + background-color: transparent; + color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + background-color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + color: #fff !important; +} +#article-container figure.gallery-group { + position: relative; + float: left; + overflow: hidden; + margin: 6px 4px; + width: calc(50% - 8px); + height: 250px; + border-radius: 8px; + background: #000; + -webkit-transform: translate3d(0, 0, 0); +} +@media screen and (max-width: 600px) { + #article-container figure.gallery-group { + width: calc(100% - 8px); + } +} +#article-container figure.gallery-group:hover img { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover .gallery-group-name::after { + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover p { + opacity: 1; + -ms-filter: none; + filter: none; + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group img { + position: relative; + margin: 0; + max-width: none; + width: calc(100% + 20px); + height: 250px; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + transition: all 0.3s, filter 375ms ease-in 0.2s; + transform: translate3d(-10px, 0, 0); + -o-object-fit: cover; + object-fit: cover; +} +#article-container figure.gallery-group figcaption { + position: absolute; + top: 0; + left: 0; + padding: 30px; + width: 100%; + height: 100%; + color: #fff; + text-transform: uppercase; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} +#article-container figure.gallery-group figcaption > a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container figure.gallery-group p { + margin: 0; + padding: 8px 0 0; + letter-spacing: 1px; + font-size: 1.1em; + line-height: 1.5; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + transition: opacity 0.35s, transform 0.35s; + transform: translate3d(100%, 0, 0); + -webkit-line-clamp: 4; +} +#article-container figure.gallery-group .gallery-group-name { + position: relative; + margin: 0; + padding: 8px 0; + font-weight: bold; + font-size: 1.65em; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#article-container figure.gallery-group .gallery-group-name:after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: #fff; + content: ''; + transition: transform 0.35s; + transform: translate3d(-100%, 0, 0); +} +#article-container .gallery-group-main { + overflow: auto; + padding: 0 0 16px; +} +#article-container .gallery-container { + margin: 0 0 16px; + text-align: center; +} +#article-container .gallery-container img { + display: initial; + margin: 0; + width: 100%; + height: 100%; +} +#article-container .gallery-container .gallery-data { + display: none; +} +#article-container .gallery-container button { + margin-top: 25px; + padding: 10px; + width: 9em; + border-radius: 5px; + background: var(--btn-bg); + color: var(--btn-color); + font-weight: bold; + font-size: 1.1em; + transition: all 0.3s; +} +#article-container .gallery-container button:hover { + background: var(--btn-hover-color); +} +#article-container .loading-container { + display: inline-block; + overflow: hidden; + width: 154px; + height: 154px; +} +#article-container .loading-container .loading-item { + position: relative; + width: 100%; + height: 100%; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + transform: translateZ(0) scale(1); + transform-origin: 0 0; +} +#article-container .loading-container .loading-item div { + position: absolute; + width: 30.8px; + height: 30.8px; + border-radius: 50%; + background: #e15b64; + transform: translate(61.6px, 61.6px) scale(1); + animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); +} +#article-container .loading-container .loading-item div:nth-child(1) { + background: #f47e60; + transform: translate(113.96px, 61.6px) scale(1); + animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; +} +#article-container .loading-container .loading-item div:nth-child(2) { + background: #e15b64; + animation-delay: -0.48s; +} +#article-container .loading-container .loading-item div:nth-child(3) { + background: #f47e60; + animation-delay: -0.96s; +} +#article-container .loading-container .loading-item div:nth-child(4) { + background: #f8b26a; + animation-delay: -1.44s; +} +#article-container .loading-container .loading-item div:nth-child(5) { + background: #abbd81; + animation-delay: -1.92s; +} +@keyframes loading-ball { + 0% { + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + transform: translate(113.96px, 61.6px) scale(1); + } +} +@keyframes loading-ball-r { + 0% { + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + transform: translate(113.96px, 61.6px) scale(0); + } +} +@keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +blockquote.pullquote { + position: relative; + max-width: 45%; + font-size: 110%; +} +blockquote.pullquote.left { + float: left; + margin: 1em 0.5em 0 0; +} +blockquote.pullquote.right { + float: right; + margin: 1em 0 0 0.5em; +} +.video-container { + position: relative; + overflow: hidden; + margin-bottom: 16px; + padding-top: 56.25%; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +.hide-inline > .hide-button, +.hide-block > .hide-button { + display: inline-block; + padding: 5px 18px; + background: #49b1f5; + color: var(--white); +} +.hide-inline > .hide-button:hover, +.hide-block > .hide-button:hover { + background-color: var(--btn-hover-color); +} +.hide-inline > .hide-button.open, +.hide-block > .hide-button.open { + display: none; +} +.hide-inline > .hide-button.open + div, +.hide-block > .hide-button.open + div { + display: block; +} +.hide-inline > .hide-button.open + span, +.hide-block > .hide-button.open + span { + display: inline; +} +.hide-inline > .hide-content, +.hide-block > .hide-content { + display: none; +} +.hide-inline > .hide-button { + margin: 0 6px; +} +.hide-inline > .hide-content { + margin: 0 6px; +} +.hide-block { + margin: 0 0 16px; +} +.toggle { + margin-bottom: 20px; + border: 1px solid #f0f0f0; +} +.toggle > .toggle-button { + padding: 6px 15px; + background: #f0f0f0; + color: #1f2d3d; + cursor: pointer; +} +.toggle > .toggle-content { + margin: 30px 24px; +} +#article-container .inline-img { + display: inline; + margin: 0 3px; + height: 1.1em; + vertical-align: text-bottom; +} +.hl-label { + padding: 2px 4px; + border-radius: 3px; + color: #fff; +} +.hl-label.default { + background-color: #777; +} +.hl-label.blue { + background-color: #428bca; +} +.hl-label.pink { + background-color: #ff69b4; +} +.hl-label.red { + background-color: #f00; +} +.hl-label.purple { + background-color: #6f42c1; +} +.hl-label.orange { + background-color: #ff8c00; +} +.hl-label.green { + background-color: #5cb85c; +} +.note { + position: relative; + margin: 0 0 20px; + padding: 15px; + border-radius: 3px; +} +.note.icon-padding { + padding-left: 3em; +} +.note > .note-icon { + position: absolute; + top: calc(50% - 0.5em); + left: 0.8em; + font-size: larger; +} +.note.blue:not(.disabled) { + border-left-color: #428bca !important; +} +.note.blue:not(.disabled).modern { + border-left-color: transparent !important; + color: #428bca; +} +.note.blue:not(.disabled):not(.simple) { + background: #e3eef7 !important; +} +.note.blue > .note-icon { + color: #428bca; +} +.note.pink:not(.disabled) { + border-left-color: #ff69b4 !important; +} +.note.pink:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff69b4; +} +.note.pink:not(.disabled):not(.simple) { + background: #ffe9f4 !important; +} +.note.pink > .note-icon { + color: #ff69b4; +} +.note.red:not(.disabled) { + border-left-color: #f00 !important; +} +.note.red:not(.disabled).modern { + border-left-color: transparent !important; + color: #f00; +} +.note.red:not(.disabled):not(.simple) { + background: #ffd9d9 !important; +} +.note.red > .note-icon { + color: #f00; +} +.note.purple:not(.disabled) { + border-left-color: #6f42c1 !important; +} +.note.purple:not(.disabled).modern { + border-left-color: transparent !important; + color: #6f42c1; +} +.note.purple:not(.disabled):not(.simple) { + background: #e9e3f6 !important; +} +.note.purple > .note-icon { + color: #6f42c1; +} +.note.orange:not(.disabled) { + border-left-color: #ff8c00 !important; +} +.note.orange:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff8c00; +} +.note.orange:not(.disabled):not(.simple) { + background: #ffeed9 !important; +} +.note.orange > .note-icon { + color: #ff8c00; +} +.note.green:not(.disabled) { + border-left-color: #5cb85c !important; +} +.note.green:not(.disabled).modern { + border-left-color: transparent !important; + color: #5cb85c; +} +.note.green:not(.disabled):not(.simple) { + background: #e7f4e7 !important; +} +.note.green > .note-icon { + color: #5cb85c; +} +.note.simple { + border: 1px solid #eee; + border-left-width: 5px; +} +.note.modern { + border: 1px solid transparent !important; + background-color: #f5f5f5; + color: #4c4948; +} +.note.flat { + border: initial; + border-left: 5px solid #eee; + background-color: #f9f9f9; + color: #4c4948; +} +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 3px; + margin-bottom: 0; + padding-top: 0 !important; + border-bottom: initial; +} +.note p:first-child, +.note ul:first-child, +.note ol:first-child, +.note table:first-child, +.note pre:first-child, +.note blockquote:first-child, +.note img:first-child { + margin-top: 0 !important; +} +.note p:last-child, +.note ul:last-child, +.note ol:last-child, +.note table:last-child, +.note pre:last-child, +.note blockquote:last-child, +.note img:last-child { + margin-bottom: 0 !important; +} +.note .img-alt { + margin: 5px 0 10px; +} +.note:not(.no-icon) { + padding-left: 3em; +} +.note:not(.no-icon)::before { + position: absolute; + top: calc(50% - 0.95em); + left: 0.8em; + font-size: larger; +} +.note.default.flat { + background: #f7f7f7; +} +.note.default.modern { + border-color: #e1e1e1; + background: #f3f3f3; + color: #666; +} +.note.default.modern a:not(.btn) { + color: #666; +} +.note.default.modern a:not(.btn):hover { + color: #454545; +} +.note.default:not(.modern) { + border-left-color: #777; +} +.note.default:not(.modern) h2, +.note.default:not(.modern) h3, +.note.default:not(.modern) h4, +.note.default:not(.modern) h5, +.note.default:not(.modern) h6 { + color: #777; +} +.note.default:not(.no-icon)::before { + content: '\f0a9'; +} +.note.default:not(.no-icon):not(.modern)::before { + color: #777; +} +.note.primary.flat { + background: #f5f0fa; +} +.note.primary.modern { + border-color: #e1c2ff; + background: #f3daff; + color: #6f42c1; +} +.note.primary.modern a:not(.btn) { + color: #6f42c1; +} +.note.primary.modern a:not(.btn):hover { + color: #453298; +} +.note.primary:not(.modern) { + border-left-color: #6f42c1; +} +.note.primary:not(.modern) h2, +.note.primary:not(.modern) h3, +.note.primary:not(.modern) h4, +.note.primary:not(.modern) h5, +.note.primary:not(.modern) h6 { + color: #6f42c1; +} +.note.primary:not(.no-icon)::before { + content: '\f055'; +} +.note.primary:not(.no-icon):not(.modern)::before { + color: #6f42c1; +} +.note.info.flat { + background: #eef7fa; +} +.note.info.modern { + border-color: #b3e5ef; + background: #d9edf7; + color: #31708f; +} +.note.info.modern a:not(.btn) { + color: #31708f; +} +.note.info.modern a:not(.btn):hover { + color: #215761; +} +.note.info:not(.modern) { + border-left-color: #428bca; +} +.note.info:not(.modern) h2, +.note.info:not(.modern) h3, +.note.info:not(.modern) h4, +.note.info:not(.modern) h5, +.note.info:not(.modern) h6 { + color: #428bca; +} +.note.info:not(.no-icon)::before { + content: '\f05a'; +} +.note.info:not(.no-icon):not(.modern)::before { + color: #428bca; +} +.note.success.flat { + background: #eff8f0; +} +.note.success.modern { + border-color: #d0e6be; + background: #dff0d8; + color: #3c763d; +} +.note.success.modern a:not(.btn) { + color: #3c763d; +} +.note.success.modern a:not(.btn):hover { + color: #32562c; +} +.note.success:not(.modern) { + border-left-color: #5cb85c; +} +.note.success:not(.modern) h2, +.note.success:not(.modern) h3, +.note.success:not(.modern) h4, +.note.success:not(.modern) h5, +.note.success:not(.modern) h6 { + color: #5cb85c; +} +.note.success:not(.no-icon)::before { + content: '\f058'; +} +.note.success:not(.no-icon):not(.modern)::before { + color: #5cb85c; +} +.note.warning.flat { + background: #fdf8ea; +} +.note.warning.modern { + border-color: #fae4cd; + background: #fcf4e3; + color: #8a6d3b; +} +.note.warning.modern a:not(.btn) { + color: #8a6d3b; +} +.note.warning.modern a:not(.btn):hover { + color: #714f30; +} +.note.warning:not(.modern) { + border-left-color: #f0ad4e; +} +.note.warning:not(.modern) h2, +.note.warning:not(.modern) h3, +.note.warning:not(.modern) h4, +.note.warning:not(.modern) h5, +.note.warning:not(.modern) h6 { + color: #f0ad4e; +} +.note.warning:not(.no-icon)::before { + content: '\f06a'; +} +.note.warning:not(.no-icon):not(.modern)::before { + color: #f0ad4e; +} +.note.danger.flat { + background: #fcf1f2; +} +.note.danger.modern { + border-color: #ebcdd2; + background: #f2dfdf; + color: #a94442; +} +.note.danger.modern a:not(.btn) { + color: #a94442; +} +.note.danger.modern a:not(.btn):hover { + color: #84333f; +} +.note.danger:not(.modern) { + border-left-color: #d9534f; +} +.note.danger:not(.modern) h2, +.note.danger:not(.modern) h3, +.note.danger:not(.modern) h4, +.note.danger:not(.modern) h5, +.note.danger:not(.modern) h6 { + color: #d9534f; +} +.note.danger:not(.no-icon)::before { + content: '\f056'; +} +.note.danger:not(.no-icon):not(.modern)::before { + color: #d9534f; +} +#article-container .tabs { + position: relative; + margin: 0 0 20px; + border-right: 1px solid var(--tab-border-color); + border-bottom: 1px solid var(--tab-border-color); + border-left: 1px solid var(--tab-border-color); +} +#article-container .tabs > .nav-tabs { + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -o-box-lines: multiple; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; + background: var(--tab-botton-bg); +} +#article-container .tabs > .nav-tabs > .tab { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + -ms-box-flex: 1; + box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 8px 18px; + border-top: 2px solid var(--tab-border-color); + background: var(--tab-botton-bg); + color: var(--tab-botton-color); + line-height: 2; + transition: all 0.4s; +} +#article-container .tabs > .nav-tabs > .tab i { + width: 1.5em; +} +#article-container .tabs > .nav-tabs > .tab.active { + border-top: 2px solid #49b1f5; + background: var(--tab-button-active-bg); + cursor: default; +} +#article-container .tabs > .nav-tabs > .tab:not(.active):hover { + border-top: 2px solid var(--tab-button-hover-bg); + background: var(--tab-button-hover-bg); +} +#article-container .tabs > .nav-tabs.no-default ~ .tab-to-top { + display: none; +} +#article-container .tabs > .tab-contents .tab-item-content { + position: relative; + display: none; + padding: 36px 24px 10px; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .tab-contents .tab-item-content { + padding: 24px 14px; + } +} +#article-container .tabs > .tab-contents .tab-item-content.active { + display: block; + animation: tabshow 0.5s; +} +#article-container .tabs > .tab-contents .tab-item-content > :last-child { + margin-bottom: 0; +} +#article-container .tabs > .tab-to-top { + padding: 0 16px 10px 0; + width: 100%; + text-align: right; +} +#article-container .tabs > .tab-to-top button { + color: #99a9bf; +} +#article-container .tabs > .tab-to-top button:hover { + color: #49b1f5; +} +@keyframes tabshow { + 0% { + transform: translateY(15px); + } + 100% { + transform: translateY(0); + } +} +#article-container .timeline { + margin: 0 0 20px 10px; + padding: 14px 20px 5px; + border-left: 2px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline.blue { + --timeline-color: #428bca; + --timeline-bg: rgba(66,139,202, 0.2); +} +#article-container .timeline.pink { + --timeline-color: #ff69b4; + --timeline-bg: rgba(255,105,180, 0.2); +} +#article-container .timeline.red { + --timeline-color: #f00; + --timeline-bg: rgba(255,0,0, 0.2); +} +#article-container .timeline.purple { + --timeline-color: #6f42c1; + --timeline-bg: rgba(111,66,193, 0.2); +} +#article-container .timeline.orange { + --timeline-color: #ff8c00; + --timeline-bg: rgba(255,140,0, 0.2); +} +#article-container .timeline.green { + --timeline-color: #5cb85c; + --timeline-bg: rgba(92,184,92, 0.2); +} +#article-container .timeline .timeline-item { + margin: 0 0 15px; +} +#article-container .timeline .timeline-item:hover .item-circle:before { + border-color: var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle > p { + font-weight: 600; + font-size: 1.2em; +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before { + left: -28px; + border: 4px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline:hover .item-circle:before { + border-color: var(--pseudo-hover); +} +#article-container .timeline .timeline-item .timeline-item-title { + position: relative; +} +#article-container .timeline .timeline-item .item-circle:before { + position: absolute; + top: 50%; + left: -27px; + width: 6px; + height: 6px; + border: 3px solid var(--pseudo-hover); + border-radius: 50%; + background: var(--card-bg); + content: ''; + transition: all 0.3s; + transform: translate(0, -50%); +} +#article-container .timeline .timeline-item .item-circle > p { + margin: 0 0 8px; + font-weight: 500; +} +#article-container .timeline .timeline-item .timeline-item-content { + position: relative; + padding: 12px 15px; + border-radius: 8px; + background: var(--timeline-bg, #e4f3fd); + font-size: 0.93em; +} +#article-container .timeline .timeline-item .timeline-item-content > :last-child { + margin-bottom: 0; +} +#article-container .timeline + .timeline { + margin-top: -20px; +} +[data-theme='dark'] { + --global-bg: #0d0d0d; + --font-color: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.4); + --hr-before-color: rgba(255,255,255,0.7); + --search-bg: #121212; + --search-input-color: rgba(255,255,255,0.7); + --search-a-color: rgba(255,255,255,0.7); + --preloader-bg: #0d0d0d; + --preloader-color: rgba(255,255,255,0.7); + --tab-border-color: #2c2c2c; + --tab-botton-bg: #2c2c2c; + --tab-botton-color: rgba(255,255,255,0.7); + --tab-button-hover-bg: #383838; + --tab-button-active-bg: #121212; + --card-bg: #121212; + --sidebar-bg: #121212; + --btn-hover-color: #787878; + --btn-color: rgba(255,255,255,0.7); + --btn-bg: #1f1f1f; + --text-bg-hover: #383838; + --light-grey: rgba(255,255,255,0.7); + --dark-grey: rgba(255,255,255,0.2); + --white: rgba(255,255,255,0.9); + --text-highlight-color: rgba(255,255,255,0.9); + --blockquote-color: rgba(255,255,255,0.7); + --blockquote-bg: #2c2c2c; + --reward-pop: #2c2c2c; + --toc-link-color: rgba(255,255,255,0.6); + --scrollbar-color: #525252; + --timeline-bg: #1f1f1f; + --zoom-bg: #121212; + --mark-bg: rgba(0,0,0,0.6); +} +[data-theme='dark'] #web_bg:before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.7); + content: ''; +} +[data-theme='dark'] #article-container code { + background: #2c2c2c; +} +[data-theme='dark'] #article-container pre > code { + background: #171717; +} +[data-theme='dark'] #article-container figure.highlight { + box-shadow: none; +} +[data-theme='dark'] #article-container .note code { + background: rgba(27,31,35,0.05); +} +[data-theme='dark'] #article-container .aplayer { + filter: brightness(0.8); +} +[data-theme='dark'] #article-container kbd { + border-color: #696969; + background-color: #525252; + color: #e2f1ff; +} +[data-theme='dark'] #page-header.nav-fixed > #nav, +[data-theme='dark'] #page-header.not-top-img > #nav { + background: rgba(18,18,18,0.8); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0); +} +[data-theme='dark'] #post-comment .comment-switch { + background: #2c2c2c !important; +} +[data-theme='dark'] #post-comment .comment-switch #switch-btn { + filter: brightness(0.8); +} +[data-theme='dark'] .note { + filter: brightness(0.8); +} +[data-theme='dark'] .hide-button, +[data-theme='dark'] .btn-beautify, +[data-theme='dark'] .hl-label, +[data-theme='dark'] .post-outdate-notice, +[data-theme='dark'] .error-img, +[data-theme='dark'] #article-container iframe, +[data-theme='dark'] .gist, +[data-theme='dark'] .ads-wrap { + filter: brightness(0.8); +} +[data-theme='dark'] img { + filter: brightness(0.8); +} +[data-theme='dark'] #aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed rgba(255,255,255,0.1); +} +[data-theme='dark'] #gitalk-container { + filter: brightness(0.8); +} +[data-theme='dark'] #gitalk-container svg { + fill: rgba(255,255,255,0.9) !important; +} +[data-theme='dark'] #disqusjs #dsqjs:hover, +[data-theme='dark'] #disqusjs #dsqjs:focus, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-tab-active, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-no-comment { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-order-label { + background-color: #1f1f1f; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body code, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body pre { + background: #2c2c2c; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body blockquote { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #artitalk_main #lazy { + background: #121212; +} +[data-theme='dark'] #operare_artitalk .c2 { + background: #121212; +} +@media screen and (max-width: 900px) { + [data-theme='dark'] #card-toc { + background: #1f1f1f; + } +} +.read-mode { + --font-color: #4c4948; + --readmode-light-color: #fff; + --white: #4c4948; + --light-grey: #4c4948; + --gray: #d6dbdf; + --hr-border: #d6dbdf; + --hr-before-color: #b9c2c9; + --highlight-bg: #f7f7f7; + --exit-btn-bg: #c0c0c0; + --exit-btn-color: #fff; + --exit-btn-hover: #8d8d8d; + --pseudo-hover: none; +} +[data-theme='dark'] .read-mode { + --font-color: rgba(255,255,255,0.7); + --readmode-light-color: #0d0d0d; + --white: rgba(255,255,255,0.9); + --light-grey: rgba(255,255,255,0.7); + --gray: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.5); + --hr-before-color: rgba(255,255,255,0.7); + --highlight-bg: #171717; + --exit-btn-bg: #1f1f1f; + --exit-btn-color: rgba(255,255,255,0.9); + --exit-btn-hover: #525252; +} +.read-mode { + background: var(--readmode-light-color); +} +.read-mode .exit-readmode { + position: fixed; + top: 30px; + right: 30px; + z-index: 100; + width: 40px; + height: 40px; + border-radius: 8px; + background: var(--exit-btn-bg); + color: var(--exit-btn-color); + font-size: 16px; + transition: background 0.3s; +} +@media screen and (max-width: 768px) { + .read-mode .exit-readmode { + top: initial; + bottom: 30px; + } +} +.read-mode .exit-readmode:hover { + background: var(--exit-btn-hover); +} +.read-mode #aside-content { + display: none; +} +.read-mode #page-header.post-bg { + background: none !important; +} +.read-mode #page-header.post-bg:before { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.read-mode #page-header.post-bg > #post-info { + text-align: center; +} +.read-mode #post { + margin: 0 auto; + background: transparent; + box-shadow: none; +} +.read-mode #post:hover { + box-shadow: none; +} +.read-mode > canvas { + display: none !important; +} +.read-mode .highlight-tools, +.read-mode #footer, +.read-mode #post > *:not(#post-info):not(.post-content), +.read-mode #nav, +.read-mode .post-outdate-notice, +.read-mode #web_bg, +.read-mode #rightside, +.read-mode .not-top-img { + display: none !important; +} +.read-mode #article-container a { + color: #99a9bf; +} +.read-mode #article-container pre, +.read-mode #article-container .highlight:not(.js-file-line-container) { + background: var(--highlight-bg) !important; +} +.read-mode #article-container pre *, +.read-mode #article-container .highlight:not(.js-file-line-container) * { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight { + border-radius: 0 !important; + box-shadow: none !important; +} +.read-mode #article-container figure.highlight > :not(.highlight-tools) { + display: block !important; +} +.read-mode #article-container figure.highlight .line:before { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight .hljs { + background: var(--highlight-bg) !important; +} +.read-mode #article-container h1, +.read-mode #article-container h2, +.read-mode #article-container h3, +.read-mode #article-container h4, +.read-mode #article-container h5, +.read-mode #article-container h6 { + padding: 0; +} +.read-mode #article-container h1:before, +.read-mode #article-container h2:before, +.read-mode #article-container h3:before, +.read-mode #article-container h4:before, +.read-mode #article-container h5:before, +.read-mode #article-container h6:before { + content: ''; +} +.read-mode #article-container h1:hover, +.read-mode #article-container h2:hover, +.read-mode #article-container h3:hover, +.read-mode #article-container h4:hover, +.read-mode #article-container h5:hover, +.read-mode #article-container h6:hover { + padding: 0; +} +.read-mode #article-container ul:hover:before, +.read-mode #article-container li:hover:before, +.read-mode #article-container ol:hover:before { + transform: none !important; +} +.read-mode #article-container ol:before, +.read-mode #article-container li:before { + background: transparent !important; + color: var(--font-color) !important; +} +.read-mode #article-container ul >li:before { + border-color: var(--gray) !important; +} +.read-mode #article-container .tabs { + border: 2px solid var(--tab-border-color); +} +.read-mode #article-container .tabs > .nav-tabs { + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab { + border-top: none !important; +} +.read-mode #article-container .tabs > .tab-contents .tab-item-content.active { + animation: none; +} +.read-mode #article-container code { + color: var(--font-color); +} +.read-mode #article-container blockquote { + border-color: var(--gray); + background-color: var(--readmode-light-color); +} +.read-mode #article-container kbd { + border: 1px solid var(--gray); + background-color: transparent; + box-shadow: none; + color: var(--font-color); +} +.read-mode #article-container .hide-toggle { + border: 1px solid var(--gray) !important; +} +.read-mode #article-container .hide-button, +.read-mode #article-container .btn-beautify, +.read-mode #article-container .hl-label { + border: 1px solid var(--gray) !important; + background: var(--readmode-light-color) !important; + color: var(--font-color) !important; +} +.read-mode #article-container .note { + border: 2px solid var(--gray); + border-left-color: var(--gray) !important; + filter: none; + background-color: var(--readmode-light-color) !important; + color: var(--font-color); +} +.read-mode #article-container .note:before, +.read-mode #article-container .note .note-icon { + color: var(--font-color); +} +.search-dialog { + position: fixed; + top: 10%; + left: 50%; + z-index: 1001; + display: none; + margin-left: -300px; + padding: 20px; + width: 600px; + border-radius: 8px; + background: var(--search-bg); + --search-height: 100vh; +} +@media screen and (max-width: 768px) { + .search-dialog { + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +.search-dialog hr { + margin: 20px auto; +} +.search-dialog .search-nav { + margin: 0 0 14px; + color: #49b1f5; + font-size: 1.4em; + line-height: 1; +} +.search-dialog .search-nav .search-dialog-title { + margin-right: 10px; +} +.search-dialog .search-nav .search-close-button { + float: right; + color: #858585; + transition: color 0.2s ease-in-out; +} +.search-dialog .search-nav .search-close-button:hover { + color: #49b1f5; +} +.search-dialog hr { + margin: 20px auto; +} +#search-mask { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + display: none; + background: rgba(0,0,0,0.6); +} +#local-search .search-dialog .local-search-box { + margin: 0 auto; + max-width: 100%; + width: 100%; +} +#local-search .search-dialog .local-search-box input { + padding: 5px 14px; + width: 100%; + outline: none; + border: 2px solid #49b1f5; + border-radius: 40px; + background: var(--search-bg); + color: var(--search-input-color); + -webkit-appearance: none; +} +#local-search .search-dialog .search-wrap { + display: none; +} +#local-search .search-dialog .local-search-hit-item { + position: relative; + padding-left: 24px; + line-height: 1.7; +} +#local-search .search-dialog .local-search-hit-item:hover:before { + border-color: var(--pseudo-hover); +} +#local-search .search-dialog .local-search-hit-item:before { + position: absolute; + top: 0.45em; + left: 0; + width: 0.5em; + height: 0.5em; + border: 3px solid #49b1f5; + border-radius: 0.5em; + background: transparent; + content: ''; + line-height: 0.5em; + transition: all 0.2s ease-in-out; +} +#local-search .search-dialog .local-search-hit-item a { + display: block; + color: var(--search-a-color); +} +#local-search .search-dialog .local-search-hit-item a:hover { + color: #49b1f5; +} +#local-search .search-dialog .local-search-hit-item .search-result-title { + font-weight: 600; +} +#local-search .search-dialog .local-search-hit-item .search-result { + margin: 0 0 8px; + word-break: break-word; +} +#local-search .search-dialog .search-result-list { + overflow-y: overlay; + margin: 0 -20px; + padding: 0 22px; + max-height: calc(80vh - 200px); +} +@media screen and (max-width: 768px) { + #local-search .search-dialog .search-result-list { + max-height: calc(var(--search-height) - 220px) !important; + } +} +.search-keyword { + background: transparent; + color: #f47466; + font-weight: bold; +} diff --git a/css/var.css b/css/var.css new file mode 100644 index 00000000..e69de29b diff --git a/daemonthread.html b/daemonthread.html new file mode 100644 index 00000000..4f014d7f --- /dev/null +++ b/daemonthread.html @@ -0,0 +1,313 @@ +多线程之守护线程和阻塞线程 | PyQt + + + + + + + + + + + + + + +

多线程之守护线程和阻塞线程

如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的 daemon 属性。

+ +

即在线程开始(thread.start ())之前,调用 setDeamon()函数,设定线程的 daemon 标志。

+

(thread.setDaemon (True))就表示这个线程 “不重要”。

+

如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用 thread.setDaemon (False),设置 daemon 的值为 false。新的子线程会继承父线程的 daemon 标志。

+

整个 Python 会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。

+

setDaemon () 函数要放在 start 之前设置才行。

+
import threading
+import time
+
+def func():
+    print("子线程开启:", time.localtime())
+    time.sleep(2)
+    print("子线程结束:", time.localtime())
+
+
+print("主线程开启:", time.localtime())
+t = threading.Thread(target=func, args=())
+# t.setDaemon(True)
+t.start()
+print("主线程关闭:", time.localtime())
+

在 Python 的多线程编程中,在实例代码中经常有 thread1.join () 这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。

+

join 的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的 join 函数。

+

先看看这个:

+
    +
  1. 阻塞主进程,专注于执行多线程中的程序。
  2. +
  3. 多线程多 join 的情况下,依次执行各线程的 join 方法,前头一个结束了才能执行后面一个。
  4. +
  5. 无参数,则等待到该线程结束,才开始执行下一个线程的 join。
  6. +
  7. 参数 timeout 为线程的阻塞时间,如 timeout=2 就是罩着这个线程 2s 以后,就不管他了,继续执行下面的代码。
  8. +
  9. 下面的例子是一次阻塞子线程,每个子线程都会等上个子线程 join 结束才会执行,如果注释掉 t.join 则会同时执行 5 个子线程,多线程在做网络访问的时候可以减少等待时间,那么在一个工作流程中可以将访问网络接口的情况做成多线程。
  10. +
+
import threading, time
+
+def func():
+    print("hello world!")
+    time.sleep(1)
+
+print("hello main start")
+for i in range(5):
+    t = threading.Thread(target=func, args=())
+    print(t.getName())
+    t.start()
+    t.join()
文章作者: Irony
文章链接: https://pyqt5.com/daemonthread.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/datawidgetmapper_625781186.html b/datawidgetmapper_625781186.html new file mode 100644 index 00000000..27813ae0 --- /dev/null +++ b/datawidgetmapper_625781186.html @@ -0,0 +1,378 @@ +QDataWidgetMapper 数据库绑定 QLineEdit控件 | PyQt + + + + + + + + + + + + + + +

QDataWidgetMapper 数据库绑定 QLineEdit控件

qt 为操作数据库提供了一个 model+view 的模式,这样简单的出入库逻辑就不需要自己编写。

+

QDataWidgetMapper 可以 将数据库的数据 映射到其他控件 。

+

注意:表格里的数据修改 还没有提交到数据库,需要点击提交按钮才生效。

+ +

https://github.com/PyQt5/PyQt/tree/master/Test/partner_625781186/16_sqlModel/01_mapper

+

# 代码

+
#-*- coding: utf-8 -*-
+
+from PyQt5 import  QtWidgets, QtGui, QtCore
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtSql import *
+
+import sys
+
+sys.path.append('./ui')
+from Ui_MainWindow import Ui_MainWindow
+
+
+class MainWindow(QMainWindow, Ui_MainWindow):
+    def __init__(self, parent=None, *args):
+
+        super(MainWindow, self).__init__(parent,  *args)
+        self.setupUi(self)
+        self.resize(800,600)
+        
+        #===============================   db   ======================================#
+        # self.db = QSqlDatabase.addDatabase('QMYSQL')
+        # self.db.setHostName("127.0.0.1")  # set address
+        # self.db.setUserName("root")  # set user name
+        # self.db.setPassword('123456')  # set user pwd   
+        # self.db.setDatabaseName("database")
+        
+        self.db = QSqlDatabase.addDatabase('QSQLITE')
+        self.db.setDatabaseName('./db/database.db')
+
+        #================================= codemodel =====================================#
+        # 实例化model
+        self.codeModel = QSqlRelationalTableModel()
+        # model设置表
+        self.initializeModel(self.codeModel, 'Mongo')
+        # 设置编辑策略
+        # self.codeModel.setEditStrategy(QSqlTableModel.OnFieldChange)
+        # !!! 这里要注意 , 只能用这个策略 , 才可以实现自动提交
+        self.codeModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
+
+        self.codeView = self.createView("code_View", self.codeModel)
+        self.verticalLayout.addWidget(self.codeView)  
+
+        #================================ initData ==================================#
+        # 数据映射
+        self.mapper = QDataWidgetMapper()
+        # 提交策略
+        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)
+        # 映射的模型源
+        self.mapper.setModel(self.codeModel)
+        self.mapper.addMapping(self.l1,0)
+        self.mapper.addMapping(self.l2,1)
+        self.mapper.addMapping(self.l3,2)
+        self.mapper.addMapping(self.l4,3)
+        self.mapper.addMapping(self.l5,4)
+
+        self.mapper.toFirst()
+        
+        #================================ pushButton ==================================#
+        self.sub_btn.clicked.connect(self.mapper.submit)
+        self.sub_btn.clicked.connect(self.codeModel.submitAll)
+        self.pre_btn.clicked.connect(self.mapper.toPrevious)
+        self.next_btn.clicked.connect(self.mapper.toNext)
+        
+    def initializeModel(self, model, tablename):
+        '''重关联。'''
+        model.setTable(tablename)
+#        model.setEditStrategy(QSqlTableModel.OnRowChange)
+        model.select()
+        
+    def createView(self, title, model):
+        '''创建TableView视图'''
+        view =  QTableView()
+        view.setModel(model)
+        view.setWindowTitle(title)
+        #列宽设置
+        view.horizontalHeader().setSectionResizeMode(3)
+        #行高设置
+        view.verticalHeader().setSectionResizeMode(1)
+        #充满列宽
+        view.horizontalHeader().setStretchLastSection(True) 
+#        view.verticalHeader().setVisible(False)#隐藏行标题
+        #标题左对齐
+        view.horizontalHeader().setDefaultAlignment(Qt.AlignLeft)
+        #标题左对齐
+        view.verticalHeader().setDefaultAlignment(Qt.AlignLeft)
+        
+        return view  
+    
+
+if __name__ == "__main__":
+    import sys
+    
+    app = QApplication(sys.argv)
+    app.setStyle(QStyleFactory.create("Fusion"))
+    ui = MainWindow()
+    ui.show()
+    sys.exit(app.exec_())
+

# 效果图

+

datawidgetmapper

+
文章作者: Irony
文章链接: https://pyqt5.com/datawidgetmapper_625781186.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/equal_str_width_625781186.html b/equal_str_width_625781186.html new file mode 100644 index 00000000..d381aa02 --- /dev/null +++ b/equal_str_width_625781186.html @@ -0,0 +1,287 @@ +python 判断屏幕等宽字符串的长度   | PyQt + + + + + + + + + + + + + +

python 判断屏幕等宽字符串的长度  

判断屏幕等宽字符串的长度?

+ +

判断屏幕等宽字符串的长度?

+

image.png

+

【新手】重庆 - 搬砖 - NoWait 22:41:50 @北京 - BUG 开发 - 黑择明 求指点
+【专家】北京 - BUG 开发 - 黑择明 22:43:04 fontMetrics
+【专家】 https://pyqt.site (892768447) 22:43:54 QFontMetrics
+【专家】 https://pyqt.site (892768447) 22:44:09 通过 QLabel.font ().fontMetrics () 得到

+

【新手】重庆 - 搬砖 - NoWait 22:52:00
+https://stackoverflow.com/questions/35771863/how-to-calculate-length-of-string-in-pixels-for-specific-font-and-size
+image.png

+

【新手】重庆 - 搬砖 - NoWait 22:53:15 感觉和 fontMetrics 应该是差不多的

+

image.png

+
+

【专家】北京 - BUG 开发 - 黑择明 (996742224) 11:29:04
+fm = QFontMetrics(QFont())
+fm.width(“qweqwe”)

+
文章作者: Irony
文章链接: https://pyqt5.com/equal_str_width_625781186.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 00000000..e0e77705 --- /dev/null +++ b/faq/index.html @@ -0,0 +1,356 @@ +常见问题 | PyQt + + + + + + + + + + + + + +

# 常见问题整理

+

这里会收集和整理各种常见问题,包括但不限于编辑器问题、编译打包问题、常见犯错。希望大家可以共同来完善此文档,编辑地址:https://github.com/PyQt5/blog/blob/dev/source/faq/index.md

+

# 案例库和提问

+

有专门的项目收集例子、提交例子、和回答问题,同时也建议大家都在上面多多提问和提交例子,这样可以留下记录方便遇到同样问题的人快速找到答案。

+

项目地址:https://github.com/PyQt5/PyQt/issues

+

如果你想写一写文章来帮助其他人少走弯路,也可以到 https://github.com/PyQt5/blog/tree/dev 去提交博客文章,访问地址是:https://pyqt5.com

+

# 文档查阅

+ +

# 界面美化

+ +

# Pyinstaller

+
    +
  1. 如果安装 anaconda, 请别用这个环境的 python
  2. +
  3. 设置 pyqt5 的环境变量
  4. +
  5. 如果在 pycharm 中把文件夹设置为了根路径,请在终端 (cmd) 中 使用命令 python xxx.py 运行脚本来确认 模块导入无错误后在打包
  6. +
  7. 这点很重要!!如果需要打包成单文件,先别用 - w 命令,最后打包无错误后再加上 - w
  8. +
  9. 如果打包后的窗体一闪而过,请在 cmd 中运行你的 exe 文件
  10. +
+

错误处理:

+
    +
  1. module PyQt5.sip not found: 确保在 cmd 模式下可以 import 这个模块后,再在程序中手动 import PyQt5.sip , 然后再打包尝试运行
  2. +
  3. Failed to load platform plugin “windows”…: 百度有解决方法,拷贝 python 目录下的 \PyQt5\Qt\plugins\platforms 到 exe 目录
  4. +
  5. QPixmap 处理 / 样式 问题 都是同 5. 一样都是 dll 丢失,到目录下找对应的文件件拷贝到 exe 目录
  6. +
  7. –add-data 打包非 python 模块文件,可能出现的问题及办法: https://github.com/pyinstaller/pyinstaller/issues/3749 +
      +
    • 还是失败的话检查 电脑用户名是否是中文,如果是中文
    • +
    • 对那个路径名进行编码
    • +
    • 则改变 spec 中 exe= EXE (…) 里的 runtime_tmpdir 指定为英文路径
    • +
    +
  8. +
  9. 如果需要打包成单文件,先别用 - w 命令,最后打包无错误后再加上 - w
  10. +
+

# Pycharm

+
    +
  1. PyQt5 环境配置 https://blog.csdn.net/px41834/article/details/79383985
  2. +
  3. 调试 PyQt 没有错误信息提示,原因以及解决办法: https://www.jianshu.com/p/47b6e7ce4639
  4. +
  5. 不识别 PyQt5 模块: +
      +
    • 新建的项目使用了新建的虚拟环境的 python.exe 解释器,更换已经安装过 pyqt5 的解释器再更新索引即可,设置 python 解释器路径在 pycharm 的菜单 File->Settings->Project:->Project Interpreter
    • +
    • 在尝试网上搜索的办法都没解决的情况下,一般就是 pycharm 的配置出问题了,找到 C:\Users\XXX\.PyCharm2018.1 路径,删除之后重启 pycharm , 重新配置
    • +
    +
  6. +
+

# Eric6

+
    +
  1. 环境配置 请参考 第一讲 https://space.bilibili.com/1863103/#/
  2. +
  3. 汉化:eric6 汉化包只到 17.12 版本,但是可以兼容高版本,自行百度或群文件下载
  4. +
  5. 双击无法打开设计师 //pyuic5|pyrcc5 无法编译 ui|qrc 文件 +
      +
    • 检查是否安装 pyqt-tools 或者 PyQt5Designer
    • +
    • 检查是否加入环境变量
    • +
    • eric6 菜单栏 设置 (settings) - 首选项 (preference) - Qt
    • +
    • Qt -> Tools -> Tools Directory: 配置 designer.exe 路径
    • +
    • PyQt -> Tools -> Tools Directory: 配置 pyuic5.exe/pyrcc5.exe 路径
    • +
    • !! 检查 qrc 路径中是否含有中文!!如果有则重命名
    • +
    +
  6. +
+

# 设计师

+
    +
  1. 通过 pip install pyqt5-tools 或者 pip install PyQt5Designer 安装
  2. +
  3. PyQt5Designer 自带汉化包,执行在 site-packages\PyQt5\Qt\bin\designer.exe
  4. +
+

# Matplotlib

+
    +
  1. PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar:http://www.cnblogs.com/hhh5460/p/5189843.html
  2. +
  3. matplotlib 绑定到 PyQt5:http://www.cnblogs.com/hhh5460/p/4322652.html
  4. +
+
\ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d8fe80072a30a86e06e8d617016b316b868e9aad GIT binary patch literal 1150 zcmZ`(ZA=?=82=lWm>540KjRgIC4 znDdKwm%}Rc{uv$ZCl2)WwCXVqA7ZgMn7>fo3)@hW^BHZeZQ9cjNck1ftg8mXHjR-a zNhGbSdvnAnzI(+>y=O7>9z1|c)6T64Bes+Gu;Hqg4bh7nAiu1=K550* zPPXBS(^^f7)6f*k*~=m0uU{(ypjo#(owirNl|TbzogYEMDP2#GYkN|Yr#?*w8m3Z2 z&5pOf7E*2@B=nkY1&K zV&+qer?9gU(b(7ex$j@$#bF{S@|SlA3B%`)aSFr$1rcNroKV$LrK7-)ytfd;V zMAh!%*wcBm@7Y+44Y6{;=E00lypr<@3iD1376|OGyic^Y6p#lOV;A0KJohn#ZoZDt ujWUFOZ$@Z~Pr-ta|3&Kmp+ks$9w9CpA&f$l!kuY^3cFMz2X* literal 0 HcmV?d00001 diff --git a/feed.json b/feed.json new file mode 100644 index 00000000..bf6edeb9 --- /dev/null +++ b/feed.json @@ -0,0 +1,231 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "PyQt", + "description": "Python PyQt PyQt6 PyQt5 PyQt4 PySide PySide2 PySide6", + "home_page_url": "https://pyqt5.com", + "items": [ + { + "id": "https://pyqt5.com/pytest_qt_modal_625781186.html", + "url": "https://pyqt5.com/pytest_qt_modal_625781186.html", + "title": "pytest-qt 测试模态窗体.", + "date_published": "2024-04-30T01:46:52.392Z", + "content_html": "

步骤分别是 :

\n
    \n
  1. \n

    点击 开始扫描 弹出 选择路径窗口;

    \n
  2. \n
  3. \n

    勾选路基;

    \n
  4. \n
\n

3. 点击确定;

\n\n

大概想测一下这个界面 :

\n

\"image.png\"

\n

步骤分别是 :

\n
    \n
  1. \n

    点击 开始扫描 弹出 选择路径窗口;

    \n
  2. \n
  3. \n

    勾选路基;

    \n
  4. \n
\n

3. 点击确定;

\n

需要测试的函数 :

\n

\"image.png\"

\n

测试函数 :

\n

\"image.png\"

\n

可以发现断言失败 .

\n

\"image.png\"

\n

官方文档:测试模态窗体.

\n

https://pytest-qt.readthedocs.io/en/latest/note_dialogs.html

\n

用的是官方的 monkeypatch 方式 .

\n

大致意思就是替换 FileSelectPathDialog 类的 exec 函数.

\n", + "tags": [ + "pytest-qt" + ] + }, + { + "id": "https://pyqt5.com/macm1pyqt.html", + "url": "https://pyqt5.com/macm1pyqt.html", + "title": "如何在Mac M1上快速安装PyQt5", + "date_published": "2023-10-07T06:08:06.000Z", + "content_html": "

由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。
\nM1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。

\n\n

1. 安装 Python
\npython-3.9.13-macosx10.9.pkg

\n

2. 勾选自定义同时只勾选安装 pip

\n

\"step1.png\"

\n

\"step1.png\"

\n

3. 设置 pip 源

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install pqi\n/Library/Frameworks/Python.framework/Versions/3.9/bin/pqi use tuna
\n

4. 安装 PyQt5

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install PyQt5
\n

5. 测试

\n
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
\n

\"step3.png\"

\n

📢📢📢

\n

也可以直接安装 Miniconda

\n

然后:conda install -c conda-forge pyqt

\n", + "tags": [ + "PyQt", + "Mac", + "M1" + ] + }, + { + "id": "https://pyqt5.com/equal_str_width_625781186.html", + "url": "https://pyqt5.com/equal_str_width_625781186.html", + "title": "python 判断屏幕等宽字符串的长度  ", + "date_published": "2019-12-26T11:49:41.000Z", + "content_html": "

判断屏幕等宽字符串的长度?

\n\n

判断屏幕等宽字符串的长度?

\n

\"image.png\"

\n

【新手】重庆 - 搬砖 - NoWait 22:41:50 @北京 - BUG 开发 - 黑择明 求指点
\n【专家】北京 - BUG 开发 - 黑择明 22:43:04 fontMetrics
\n【专家】 https://pyqt.site (892768447) 22:43:54 QFontMetrics
\n【专家】 https://pyqt.site (892768447) 22:44:09 通过 QLabel.font ().fontMetrics () 得到

\n

【新手】重庆 - 搬砖 - NoWait 22:52:00
\nhttps://stackoverflow.com/questions/35771863/how-to-calculate-length-of-string-in-pixels-for-specific-font-and-size
\n\"image.png\"

\n

【新手】重庆 - 搬砖 - NoWait 22:53:15 感觉和 fontMetrics 应该是差不多的

\n

\"image.png\"

\n
\n

【专家】北京 - BUG 开发 - 黑择明 (996742224) 11:29:04
\nfm = QFontMetrics(QFont())
\nfm.width(“qweqwe”)

\n", + "tags": [ + "Python" + ] + }, + { + "id": "https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html", + "url": "https://pyqt5.com/use_pyuic_insteadof_pyside2uic.html", + "title": "修改pyuic代替pyside2-uic.", + "date_published": "2019-12-26T11:49:41.000Z", + "content_html": "

修改 pyuic 代替 pyside2-uic

\n\n

修改 pyuic 代替 pyside2-uic.

\n

最近看到挺多人用 pyside2 的 uic 编译 ui 文件有问题 .
\n 写个解决办法.

\n

首先,
\n pip install qtpy ,
\n 这个是兼容 pyqt5 和 pyside2 的,无缝转换 .

\n

然后,
\n 修改 pyqt5 的 uic ,

\n

\"image.png\"

\n

最后用 pyuic5 , 生成 Ui_XXX.py 文件 .

\n", + "tags": [ + "PyQt5 PySide2" + ] + }, + { + "id": "https://pyqt5.com/studynotes.html", + "url": "https://pyqt5.com/studynotes.html", + "title": "PyQt学习心得", + "date_published": "2019-08-26T01:00:00.000Z", + "content_html": "

在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。

\n\n

# Python 基础

\n

在学习和使用 PyQt 之前需要熟练使用 Python,经过对 QQ 群里经常提问的问题的分析,发现大部分人对 Python 中的基础知识掌握不牢固导致很多基础问题,如果要想更好的使用 Python 以及它的扩展必需要进行系统的学习。这里列举一下常用的知识点。

\n
    \n
  1. 类         参考资料
  2. \n
  3. 类的继承
  4. \n
  5. 类的多继承
  6. \n
  7. 类方法重写     参考资料
  8. \n
  9. 类中的 super 函数  参考资料
  10. \n
  11. 函数调用 / 参数类型
  12. \n
  13. 对象调用 (参考第 1 点)
  14. \n
\n

必须熟练掌握上面的知识点后入门 PyQt 才比较容易,如果初学者对上面的知识点还不是很了解,本文不适合继续往下阅读。

\n

# 设计师

\n

Qt 设计师除了方便快速设计一些简单的界面外,其实笔者觉得更大的作用在于帮助用户熟悉各类控件、属性、信号等

\n
    \n
  1. 这里建议初学者不要急于求成,打开设计师新建一个 Widget 的窗口,比如
  2. \n
\n

\"desiger_create\"

\n
    \n
  1. 然后把左侧的所有控件挨个拖动到中间的窗口中,比如这里拖动一个 Push Button 按钮
  2. \n
\n

\"desiger_drag\"

\n
    \n
  1. 在设计师右下角的属性编辑器中列举了该控件的所有父类,意味着可以调用和重写父类的所有方法,建议初学者把这个属性编辑器的所有属性挨个调整看看效果,部分控件可能需要 Ctrl+R 预览界面才能看到,同时像 QListWidget,QTreeWidget,QTableWidget 等某些控件需要在控件上右键增加数据才可以
  2. \n
\n

\"desiger_property\"
\n\"desiger_property2\"

\n
    \n
  1. 两个控件之间简单的信号槽关联可以通过设计师快速的设置
  2. \n
\n

\"desiger_signal\"
\n\"desiger_signal2\"

\n
    \n
  1. 提高进阶的方法,当你需要手动写代码实现界面的时候,不妨把 UI 文件转出 PY 文件,看看是如何构造的(这里涉及到布局等知识见后文)
  2. \n
\n

# 布局

\n

Qt 界面提供了方便的 4 种基本布局,QVboxLayout,QHboxLayout,QFormLayout,QGridLayout,初学者需要数量掌握这 4 种布局外加 2 种拉伸器(占位挤压)

\n

首先需要知道 Qt 界面的中控件的层级顺序以及 parent,parent 的作用既作为子控件的父元素也可以自动管理 Qt 的对象(具体可以搜索下关于 Qt parent 的资料)

\n
    \n
  1. 在没有布局的情况下,在设计师中拖动摆放的控件是一层一层的叠加覆盖,此时每个添加的子控件的 parent 都是最外层的控件
  2. \n
\n

\"desiger_stack\"

\n
    \n
  1. 如果需要界面中的控件自动适应高度宽度,此时则需要使用 4 种布局来包裹里面的子控件,注意的是:布局不是控件不能设置高度宽度和样式等,是一个抽象的东西,就好比是一根橡皮筋包裹几个矩形的物品;布局也可以设置一些属性(在设计师属性编辑器中),比如设置两者直接的间距,设置距离上下左右的间距,设置比例等
  2. \n
\n

\"desiger_layout\"

\n
    \n
  1. 在没有布局或者有布局的时候。可以添加容器控件(QWidget,QFrame,QGroupBox,QScrollArea,QToolBox,QTabWidget,QStackedWidget,QMidArea,QDockWidget)这些容器可以放置子控件,从而循环嵌套。
  2. \n
\n

# 例子

\n

在 PyQt5.5 的时候自带了一个例子文件夹(后面的版本没有的话可以下载 PyQt5 源码,里面有个 examples 文件夹),想要熟练的掌握 PyQt 还需要从自带的例子中学习,必须要每个例子都运行一次然后看看这个例子实现了什么,这样才能记忆深刻。
\n同时很多开发者在 https://github.com/PyQt5/PyQt 分享了各类进阶例子,同时也欢迎大家共同完善该项目,提供更多更好的例子。另外也可以下载该项目的客户端 PyQtClient 软件,支持运行其中的例子

\n

建议在更深入的学习 PyQt 之前多看看一些例子。

\n

# 文档

\n

接下来要说的就是 Qt 的 api 文档,官网文档,这里其实不要害怕是英文就不想看,觉得看不懂了,其实官网的文档还是比较简洁的,而且函数名也比较直观就能知道意思。也可以用谷歌浏览器打开右键翻译,基本上都能看懂。笔者前期写过一篇如何查阅 Qt 文档的文档可以阅读学习一番。

\n

这里就拿 QWebEngineView 举一个例子,首先初学者在使用这个浏览器控件时候,会有诸多的问题比如:Cookie,拦截器等就不知道如何去调用函数来设置

\n
    \n
  1. 首先打开官网文档 https://doc.qt.io/qt-5/qwebengineview.html,可以看到只有少量的函数可以调用,寻找一番并没有发现和 Cookie 相关的东西,这个时候就需要把重点放在有特俗返回值的函数上,比如:
  2. \n
\n
QWebEngineHistory *\t          history() const\nQWebEnginePage *\t          page() const\nQWebEngineSettings *\t      settings() const
\n

这三个函数返回了一个类实例,就意味着可以调用其中的方法。

\n
    \n
  1. \n

    点击 page () 打开 https://doc.qt.io/qt-5/qwebenginepage.html,发现没有 cookie 相关的东西,只有 QWebEngineProfile *\tprofile () const 这个函数比较可疑。

    \n
  2. \n
  3. \n

    点击 **profile ()** 打开 https://doc.qt.io/qt-5/qwebengineprofile.html,在浏览器中搜索 cookie 发现这个类中包含大量和 cookie 相关的东西,比如:**QWebEngineCookieStore *\tcookieStore ()`** 从名字上可以猜测大概意思为 cookie 储存

    \n
  4. \n
  5. \n

    点击 **cookieStore ()** 打开 https://doc.qt.io/qt-5/qwebenginecookiestore.html,此时就会发现这个类里面包含了删除和设置 cookie 的方法。

    \n
  6. \n
  7. \n

    但是找到了这些方法后,面对初学者又一个问题来了,该如何去用?根据上面 4 点整理一下,把他们当做简单的 Python 对象,方法和操作方法和 class 一样的。

    \n
  8. \n
\n
self.webview = QWebEngineView()\n# 得到page\npage = self.webview.page()\n# 得到profile\nprofile = page.profile()\n# 得到cookieStore\ncookieStore = profile.cookieStore()\n# 清空cookie\ncookieStore.deleteAllCookies()\n\n# 用简短代码来表达就是\ncookieStore = self.webview.page().profile().cookieStore()\ncookieStore.deleteAllCookies()
\n

# 异常调试

\n

可能有时候由于粗心,或者调用了一些非法函数,参数错误等会导致程序出现一些异常,首先第一步复制最后一行的错误去百度或者谷歌搜索,大多时候能找到问题所在。其次如果搜索不到或者自己的异常可能是由于某个变量的值不对引起的,就需要在编辑器中打断点使用 DEBUG 模式调试变量值(如果不会可以采用麻烦一点的办法:用 print 打印出变量值)

\n

遇到问题后首先需要自己多调试排查问题,不要一遇到问题就去问,自己多尝试一个一个排查直到找到问题所在并解决,这也是一种提高自身能力的地方。

\n

# 检索资料

\n

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。信息检索是每个程序猿必备的能力之一,其好处在于可以更快更准确的在茫茫网络海洋中找到自己所需要的东西,这个过程需要长期不断积累和练习。

\n
    \n
  1. 中文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt 拖拽
  2. \n
  3. 英文搜索引擎:采用多个关键词 以空格分开搜索,如:PyQt Drag Drop
  4. \n
\n

# 片尾

\n

好了,笔者基本上的学习过程就整理如上,这并不是说每个人都适合这样的方法,但至少笔者是这样一步一步走过来的。当你养成了一个学习、发现和解决问题的好习惯时就会慢慢得心应手。

\n", + "tags": [ + "PyQt" + ] + }, + { + "id": "https://pyqt5.com/python_statemachine_625781186.html", + "url": "https://pyqt5.com/python_statemachine_625781186.html", + "title": "python 状态机模块  ", + "date_published": "2019-07-17T09:03:33.000Z", + "content_html": "

用状态来取代 if…else 判断。

\n\n

GUI 涉及到挺多的状态改变,以前一直用 if…else 来判断,最近读了设计模式,发现有个状态模式,随后发现了状态机这个东西 .

\n

python 的状态机模块挺多的,不过好像很多都不更新了.
\n 推荐 2 个状态机模块,但是也没有太深入的使用经验,就跑跑例子,以后有更详细的 pyqt 例子再补上 .

\n

1: pip install python-statemachine

\n

官方例子 : https://github.com/fgmacedo/python-statemachine

\n

2. pip install state_machine

\n

官方例子 : https://github.com/jtushman/state_machine

\n

1 的 最近一次更新在 6 个月以前,使用 类继承mixin 方式,不过有些地方不如 2 个人性化;

\n

2 的设计更人性化一些,包括状态改变 beforeafter , 不过由于是装饰器实现的动态增加属性,有些地方编辑器智能提示可能就靠不上了.

\n

两者实现实现方式不一样,有兴趣可以读读源码 .

\n
    \n
  1. qt 内置状态机框架
  2. \n
\n

https://blog.csdn.net/amnes1a/article/details/62418196

\n

https://blog.csdn.net/dongfenghuojian/article/details/78187131

\n

http://blog.sina.com.cn/s/articlelist_3284623693_0_1.html (系列教程)

\n", + "tags": [ + "Python", + "python 状态机" + ] + }, + { + "id": "https://pyqt5.com/pyqt5_hook_key_625781186.html", + "url": "https://pyqt5.com/pyqt5_hook_key_625781186.html", + "title": "在pyqt中使用python全局钩子模块", + "date_published": "2019-07-06T17:37:22.000Z", + "content_html": "

在某些时候需要为自己的软件增加全局键盘监听,比如软件最小化隐藏后可以通过热键唤醒,又或者比如像 QQ 一样可以全局热键截图。这里介绍几个方法实现在 PyQt 中使用 Python 全局钩子模块实现全局热键功能。

\n\n
    \n
  1. pyHook3
  2. \n
\n

安装命令 : pip install pyhook3

\n

https://blog.csdn.net/q871063970/article/details/86648386

\n

似乎将 pyhook 支持 py3 版本的了?没有太多研究.

\n

缺点:只支持 win 平台.

\n

2. keyboard & mouse

\n

安装命令: pip install keyboard mouse

\n
\nfrom PyQt5 import  QtGui, QtWidgets, QtCore\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtWidgets import *\nimport keyboard\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.testBtn = QPushButton(self)\n        layout.addWidget(self.testBtn)\n\n        keyboard.add_hotkey('ctrl+shift+x', lambda:print('triggered', 'hotkey'))\n        keyboard.add_hotkey('ctrl+shift+c', self.abc,args=('aa',"bb","cc"))\n\n    def abc(self,a,b,c):\n        print(a,b,c)\n        \nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

更详细例子 : pyqt 中使用 keyboard 全局热键

\n

优点:跨平台;

\n

缺点:模块名字取得太差,不容易被发现.

\n", + "tags": [ + "Python", + "pyqt hook key" + ] + }, + { + "id": "https://pyqt5.com/read_open_source.html", + "url": "https://pyqt5.com/read_open_source.html", + "title": "像读文章一样读源码", + "date_published": "2019-07-06T17:37:22.000Z", + "content_html": "

使用 snoop, 像读文章一样读源码。

\n\n

不得不说 开源项目没有一个提纲 , 看起来太操蛋了。问了作者, 作者说 , 你运行下主函数, 然后慢慢跟 。。。
\n\"image.png\"

\n

没有目的地概览 , 不知不觉就追究到细节里面去了。

\n

\"image.png\"

\n

所以这一篇文章的目地就是 , 如何在没有提纲的情况下 , 能更好的只关注流程 , 而不是细节 。

\n

开始 :

\n
    \n
  1. python DEBUG 模块介绍 :
    \n 前段时间看过挺多文章提到 pysoonper 这个调试模块,有兴趣的可以百度一下.
    \n 个人尝试了一下,篇幅过大的 DEBUG 不适合用 pysoonper , 因为没有缩进!
    \n 这几天偶然遇到一个二次封装的模块 snoop, 完美地解决了这个问题.
  2. \n
  3. 操作步骤 :
  4. \n
\n
    \n
  • 1 . 在 eric6.pymain() 函数上加 snoop 装饰器;
    \n\"image.png\"
  • \n
  • 2 . 用 vscode 打开 eric6start_.log 文件 (8 层深度 log 文件 34W 行,pycharm 对大文件支持很差);
    \n\"log文件\"
  • \n
\n

发现可以折叠 , 但是最大可折叠等级只到 5 级 , 而且无法对对应等级折叠 , 有点遗憾 。也许是.log 格式选得不太好, 不知道是否有更好的后缀格式。

\n
    \n
  • 3 . vscode 配置 log 文件关键字高亮;
    \n安装高亮插件
    \n\"image.png\"
    \n 配置高亮关键字
    \n\"image.png\"
  • \n
\n

callreturn 给加进去.

\n
    \n
  • 4 . 增加阶段关键字;
  • \n
\n

\"eric6启动阶段\"

\n

\"image.png\"

\n

#000 是为了方便搜索 。
\n需要自己手动折叠 。
\n可以发现 每个 splash.showMessage() 都是一个阶段 , 展开折叠之后就是每个阶段具体执行细节 。

\n
\n

# ps: vscode 阅读 log 文件还是有一些不方便的地方,除了在 2. 中提到的,还有包括关闭文件再打开,折叠状态不会保留,有其他更好的方式 请留言告诉我,谢谢.

\n", + "tags": [ + "Python", + "debug", + "snoop" + ] + }, + { + "id": "https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html", + "url": "https://pyqt5.com/pyqt_get_subprocess_pipeline_625781186.html", + "title": "python 获取子进程print信息  ", + "date_published": "2019-05-24T06:39:44.000Z", + "content_html": "

在 PyQt 中使用子线程读取子进程 Python 脚本的 print 输出流内容。

\n\n

问题所在:

\n

\"image.png\"

\n

如果模块都由自己开发, 正常操作

\n

\"image.png\"

\n

但是因为不能改,所以只能拦截:
\n代码:

\n
pythonPath = self.pythonPath_cb.currentText()\n\nif suffix == \"py\":\n    # 首次\n    self.pyCommand = [pythonPath, path]\n    self.modifiedReloadPython(path)\ndef modifiedReloadPython(self, path_):\n    os.chdir(os.path.dirname(path_))\n    # 子进程调用\n    self.p = subprocess.Popen(self.pyCommand, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n    # self.stdoutWorker.p = self.p\n    self.stdoutWorker = Worker(self.p)\n    self.stdoutWorker.stdout_signal.connect(lambda x: self.error_te.append(\"PYDEBUG:\\n\" + x))\n    self.stdoutWorker.start()\nclass Worker(QThread):\n    stdout_signal = pyqtSignal(str)\n\n    def __init__(self, p, parent=None):\n        super().__init__(parent)\n        self.p = p\n\n    def run(self):\n        while True:\n            QApplication.processEvents()\n            if self.p is not None:\n                line = self.p.stdout.readline()\n                # line = line.strip()\n                if line != b'':\n                    try:\n                        info = line.decode()\n                        self.stdout_signal.emit(info)\n                    except:\n                        self.stdout_signal.emit(repr(line))\n    
\n", + "tags": [ + "Python", + "subprocess.Popen", + "拦截print" + ] + }, + { + "id": "https://pyqt5.com/qtwebjs.html", + "url": "https://pyqt5.com/qtwebjs.html", + "title": "QtWebkit和QWebEngineView与Javascript交互", + "date_published": "2019-05-22T03:30:36.000Z", + "content_html": "

以前还是 QWebView 的时候和 Javascript 交互起来很方便,但是到了 Qt5.6 以后改用了 QWebEngineView ,并通过其提供的 qwebchannel.js 来进行交互。可能是由于刚出来的原因,这玩意儿有个 bug 就是必须在每次加载页面的时候手动注入,跳转页面后就失效了,需要手动注入,目前有没有修复具体未测试。这里对 QWebViewQWebEngineView 与 Js 交互都做了一个示例。

\n\n

# 说明

\n
    \n
  1. 针对 QWebView 通过 QWebFrameaddToJavaScriptWindowObject 把对象传递到 Javascript
  2. \n
  3. 针对 QWebEngineView 通过 QWebChannel.registerObject('Bridge', QObject) 把对象传递到 Javascript
  4. \n
  5. 可以通过 @pyqtSlot 装饰器来申明该方法可以暴露给 Javascript 调用
  6. \n
\n
@pyqtSlot(str)\ndef callFromJs(self, text):\n    QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))
\n
    \n
  1. 针对 QWebViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
  2. \n
\n
// 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)\nBridge.windowTitleChanged.connect({fun: function(title) {\n    showLog(\"标题被修改为:\" + title);\n}}, \"fun\");\n\n// 绑定自定义的信号customSignal\nBridge.customSignal.connect({fun: function(text) {\n    showLog(\"收到自定义信号内容:\" + text);\n}}, \"fun\");
\n
    \n
  1. 针对 QWebEngineViewJavascript 中获取该对象,可以通过该对象对窗口属性以及信号和暴露出的方法进行调用
  2. \n
\n
new QWebChannel(qt.webChannelTransport,\n    function(channel) {\n        window.Bridge = channel.objects.Bridge;\n        \n        // 这里绑定窗口的标题变化信号(这个信号是由QWidget内部的)\n        Bridge.windowTitleChanged.connect(function(title) {\n            showLog(\"标题被修改为:\" + title);\n        });\n        \n        // 绑定自定义的信号customSignal\n        Bridge.customSignal.connect(function(text) {\n           showLog(\"收到自定义信号内容:\" + text);\n        });\n    }\n);
\n

# 代码

\n

QWebViewhttps://github.com/PyQt5/PyQt/blob/master/QWebView/JsSignals.py

\n

QWebEngineViewhttps://github.com/PyQt5/PyQt/blob/master/QWebEngineView/JsSignals.py

\n
    \n
  1. 针对 QWebView 的核心实现
  2. \n
\n
class WebView(QWebView):\n\n    customSignal = pyqtSignal(str)\n\n    def __init__(self, *args, **kwargs):\n        super(WebView, self).__init__(*args, **kwargs)\n        self.initSettings()\n        # 暴露接口对象\n        self.page().mainFrame().javaScriptWindowObjectCleared.connect(self._exposeInterface)\n\n    def _exposeInterface(self):\n        \"\"\"向Js暴露调用本地方法接口\n        \"\"\"\n        self.page().mainFrame().addToJavaScriptWindowObject('Bridge', self)\n\n    # 注意pyqtSlot用于把该函数暴露给js可以调用\n    @pyqtSlot(str)\n    def callFromJs(self, text):\n        QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))\n\n    def sendCustomSignal(self):\n        # 发送自定义信号\n        self.customSignal.emit('当前时间: ' + str(time()))
\n
    \n
  1. 针对 QWebEngineView 的核心实现
  2. \n
\n
class WebEngineView(QWebEngineView):\n\n    customSignal = pyqtSignal(str)\n\n    def __init__(self, *args, **kwargs):\n        super(WebEngineView, self).__init__(*args, **kwargs)\n        self.channel = QWebChannel(self)\n        # 把自身对象传递进去\n        self.channel.registerObject('Bridge', self)\n        # 设置交互接口\n        self.page().setWebChannel(self.channel)\n\n    # 注意pyqtSlot用于把该函数暴露给js可以调用\n    @pyqtSlot(str)\n    def callFromJs(self, text):\n        QMessageBox.information(self, \"提示\", \"来自js调用:{}\".format(text))\n\n    def sendCustomSignal(self):\n        # 发送自定义信号\n        self.customSignal.emit('当前时间: ' + str(time()))
\n

# 效果图

\n

\"JsSignals\"

\n", + "tags": [ + "PyQt", + "QWebView", + "QWebEngineView", + "浏览器" + ] + }, + { + "id": "https://pyqt5.com/flipwidgetanimation.html", + "url": "https://pyqt5.com/flipwidgetanimation.html", + "title": "PyQt5窗口翻转动画", + "date_published": "2019-05-15T14:48:00.000Z", + "content_html": "

QQ 的界面一直是用来模仿练习做界面的好东西,这里就有一个类似 QQ 登录界面的实现翻转效果,当然这里并没有用两个窗口去做,而是用了 QStackedWidget 包含两个控件做切换,同时单独使用一个窗口做动画绘制。

\n\n

# 原理说明

\n
    \n
  1. 用了两个 QLabel 来显示模拟的图片界面,并实现鼠标点击模拟真实的窗口对应位置点击
  2. \n
  3. 用了 QStackedWidget 来存放上面的两个界面 QLabel
  4. \n
  5. 点击切换时主要是对上面的两个界面进行截图并传递给翻转动画窗口
  6. \n
  7. 通过 setWindowOpacity 控制主窗口的显示隐藏(保留任务栏),当然也可以用 hide
  8. \n
  9. 动画窗口 FlipWidget.py 主要实现两张图片的翻转显示,考虑到 0-90 和 90-180 之前的情况,以及图片的缩放动画
  10. \n
\n

# 核心实现

\n
    \n
  1. 主要是在 paintEvent 方法中使用 QTransformQPainter 进行圆心变换以及 rotate 设置翻转角度
  2. \n
  3. 同时根据翻转的角度范围对图片进行切换和缩放
  4. \n
\n
def paintEvent(self, event):\n    super(FlipWidget, self).paintEvent(event)\n\n    if hasattr(self, 'image1') and hasattr(self, 'image2') and self.isVisible():\n\n        painter = QPainter(self)\n        painter.setRenderHint(QPainter.Antialiasing, True)\n        painter.setRenderHint(QPainter.SmoothPixmapTransform, True)\n\n        # 变换\n        transform = QTransform()\n        # 把圆心设置为矩形中心\n        transform.translate(self.width() / 2, self.height() / 2)\n\n        if self._angle >= -90 and self._angle <= 90:\n            # 当翻转角度在90范围内显示第一张图,且从大图缩放到小图的过程\n            painter.save()\n            # 设置翻转角度\n            transform.rotate(self._angle, Qt.YAxis)\n            painter.setTransform(transform)\n            # 缩放图片高度\n            width = self.image1.width() / 2\n            height = int(self.image1.height() *\n                         (1 - abs(self._angle / self.Scale) / 100))\n            image = self.image1.scaled(\n                self.image1.width(), height,\n                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)\n            painter.drawPixmap(\n                QPointF(-width, -height / 2), image)\n            painter.restore()\n        else:\n            # 当翻转角度在90范围内显示第二张图,且从小图缩放到原图的过程\n            painter.save()\n            if self._angle > 0:\n                angle = 180 + self._angle\n            else:\n                angle = self._angle - 180\n            # 设置翻转角度, 注意这里角度有差异\n            transform.rotate(angle, Qt.YAxis)\n            painter.setTransform(transform)\n            # 缩放图片高度\n            width = self.image2.width() / 2\n            height = int(self.image2.height() *\n                         (1 - ((360 - abs(angle)) / self.Scale / 100)))\n            image = self.image2.scaled(\n                self.image2.width(), height,\n                Qt.IgnoreAspectRatio, Qt.SmoothTransformation)\n            painter.drawPixmap(\n                QPointF(-width, -height / 2), image)\n            painter.restore()
\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/FlipWidgetAnimation.py

\n

# 效果图

\n

\"FlipWidgetAnimation\"

\n", + "tags": [ + "PyQt", + "动画", + "翻转" + ] + }, + { + "id": "https://pyqt5.com/QPropertyAnimation.html", + "url": "https://pyqt5.com/QPropertyAnimation.html", + "title": "PyQt属性动画(QPropertyAnimation)", + "date_published": "2019-05-08T07:43:06.000Z", + "content_html": "

QPropertyAnimation 继承自 QVariantAnimation ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 QObject 的对象中定义的属性做修改,
\n简单来说就是基类是 QObject 且定义了属性变量,就可以用 QPropertyAnimation 来做属性动画。同时也可以通过 pyqtProperty 来增加自定义属性。

\n\n

首先,通过构造函数 QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None) 创建一个对象,其中

\n
    \n
  1. 第一个参数是动画作用的对象,也可以通过 setTargetObject 设置
  2. \n
  3. 第二个参数是属性名,在 py3 中类型是 bytes,也可以通过 setPropertyName 设置
  4. \n
\n

# 函数

\n

一些常见的设置函数

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
setPropertyName设置属性名
setTargetObject设置动画作用对象
setDuration设置动画持续时间(毫秒)
setStartValue设置开始值
setEndValue设置结束值
setEasingCurve设置动画曲线
setKeyValueAt插入线性值
setLoopCount设置循环次数(-1 为永久)
\n

# 示例

\n

比如这个例子:

\n
    \n
  1. 修改控件的 geometry 大小
  2. \n
  3. 修改自定义属性
  4. \n
  5. 修改进度条的 value 值
  6. \n
\n

\"QPropertyAnimation\"

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年5月8日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: \n@description: \n\"\"\"\nfrom PyQt5.QtCore import QPropertyAnimation, QRect, pyqtProperty, QEasingCurve\nfrom PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout,\\\n    QLabel, QProgressBar, QSpacerItem, QSizePolicy\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        self.resize(400, 400)\n        self._value = 0\n        self.button = QPushButton('属性动画测试', self)\n        self.button.clicked.connect(self.doStart)\n        self.button.setGeometry(0, 0, 80, 40)\n\n        self.buttonc = QPushButton('自定义属性 测试', self)\n        self.buttonc.clicked.connect(self.doStartCustom)\n\n        self.label = QLabel('', self)\n\n        self.progressbar = QProgressBar(self)\n        self.progressbar.setRange(0, 99)\n\n        layout = QVBoxLayout(self)\n        layout.addItem(QSpacerItem(\n            20, 60, QSizePolicy.Fixed, QSizePolicy.Fixed))\n        layout.addWidget(self.buttonc)\n        layout.addWidget(self.label)\n        layout.addWidget(self.progressbar)\n\n        # 进度条动画\n        self.progressStart()\n\n    # 此处是自定义属性,并通过动画修改后,设置QLabel的值\n    @pyqtProperty(int)\n    def value(self):\n        return self._value\n\n    @value.setter\n    def value(self, v):\n        self._value = v\n        self.label.setText('当前值:{}'.format(v))\n\n    def doStart(self):\n        # 第一个参数是要执行的对象\n        animation = QPropertyAnimation(self.button, b'geometry', self)\n        animation.setDuration(2000)  # 持续时间\n        # 缓和曲线风格,加了曲线动画会很大程度影响\n        animation.setEasingCurve(QEasingCurve.OutBounce)\n        animation.setStartValue(QRect(0, 0, 40, 40))\n        animation.setEndValue(QRect(250, 250, 80, 80))\n        animation.start(animation.DeleteWhenStopped)\n\n    def doStartCustom(self):\n        # 自定义属性动画\n        # 由于定义的属性是在继承的QWidget, 所以第一个参数是self\n        # 第二个参数就是 value\n        animation = QPropertyAnimation(self, b'value', self)\n        animation.setDuration(2000)  # 持续时间\n        animation.setStartValue(0)\n        animation.setEndValue(100)\n        animation.start(animation.DeleteWhenStopped)\n\n    def progressStart(self):\n        # 进度条动画\n        # 这里 value是QProgressBar自带的属性,具体可以看文档\n        # https://doc.qt.io/qt-5/qprogressbar.html#properties\n        animation = QPropertyAnimation(self.progressbar, b'value', self)\n        animation.setDuration(2000)  # 持续时间\n        animation.setLoopCount(-1)\n        # 这里采用插入线性值,第一个参数的范围是(0-1)\n        # 第二个参数的范围是进度(最小值-最大值)\n        animation.setKeyValueAt(0, self.progressbar.minimum())\n        animation.setKeyValueAt(0.1, 10)\n        animation.setKeyValueAt(0.2, 30)\n        animation.setKeyValueAt(0.5, 60)\n        animation.setKeyValueAt(0.7, 80)\n        animation.setKeyValueAt(1, self.progressbar.maximum())\n        animation.start(animation.DeleteWhenStopped)\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())\n
", + "tags": [ + "PyQt", + "动画" + ] + }, + { + "id": "https://pyqt5.com/viewapi.html", + "url": "https://pyqt5.com/viewapi.html", + "title": "如何查阅Qt文档", + "date_published": "2019-05-04T12:50:20.000Z", + "content_html": "

很多网友在问有没有 PyQt5 的文档之类的问题,在 PyQt4 的时候 PyQt 官网有了英文版的文档,随后有网友翻译成了中文。不过现在 PyQt5 官方的文档都指向了 C 的 Qt 文档,其实 C 的 Qt API 文档结构很清晰,翻阅很容易的,需要注意几点。

\n\n

作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。

\n

拿 Qt C++ 文档来说,官网地址是:https://doc.qt.io/qt-5/qtwidgets-module.html 这里面记录了所有控件的详细函数文档。

\n

比如拿 输入框 QLineEdit 来说,怎么去查询它的用法和信号槽等资料?

\n

https://doc.qt.io/qt-5/qlineedit.html

\n

# 左侧目录

\n

在文档左侧目录中有如下几个:

\n

Properties - 控件里的属性(比如宽高等,通常需要当作函数调用)

\n

Public Slots - 这个是控件自己的槽函数(当作普通函数就行)

\n

Signals - 这个是输入框的包含的信号

\n

Public Functions、Reimplemented Public Functions、Static Public Members、Protected Functions、Reimplemented Protected Functions - 这几个都是函数列表

\n

\"howtoviewapi1\"

\n

# 类说明

\n

\"howtoviewapi2\"

\n

这里有两个注意点

\n
    \n
  1. 红色方框内的表示该控件(输入框)继承于 QWidget ,所以该控件(输入框)拥有父类的所有方法和信号,当当前文档找不到相关资料和函数时,可以去父类找找看。
  2. \n
  3. 紫色方框内表示列举所有的方法(包括父类)
  4. \n
\n

# 函数列表

\n

\"howtoviewapi3\"

\n

这里列举的就是该控件(输入框)的函数,同理点击上面的紫色方框是查看所有方法,一般这里主要用来查询你需要的功能函数,Qt 的函数名比较容易理解,比如:只读 ReadOnly,选择文字:setSelection。

\n

所以再查下这部分资料的时候建议在浏览器中 Ctrl + F 打开浏览器的搜索框,并输入英文关键词来检索你所需要的函数在哪里。

\n

\"howtoviewapi8\"

\n

# 槽函数

\n

\"howtoviewapi4\"

\n

这部分列举的是槽函数,其实在 PyQt 中槽函数可以当作普通的函数。普通的函数也可以作为槽函数,直接通过信号连接即可,注意方框所示,还有很多函数是在父类里面。

\n

# 信号

\n

\"howtoviewapi5\"

\n

这部分列举了该控件(输入框)所定义的信号,主要还是看名字,大多都能知道是做什么的,比如:

\n
    \n
  1. editingFinished - 编辑完成信号
  2. \n
  3. returnPressed - 回车键信号
  4. \n
  5. textChanged (const QString &text) - 内容改变信号
  6. \n
\n

这里还有个问题就是参数问题,一般 & 后面的 text 作为参数传递到槽函数中

\n

# 函数详细说明

\n

当不明确这个函数是做什么的,可以点击该函数跳转到下面的说明,比如回车键信号 returnPressed

\n

\"howtoviewapi6\"

\n

如图上所示,用翻译插件翻译,大部分就明白了,如下:

\n

\"howtoviewapi7\"

\n

# 关于如何搜索资料

\n

比如当你要搜索输入框内容改变事件,一般建议两种搜索,且搜索的时候用空格把关键词分开搜索,而且直接用控件名

\n
    \n
  1. 中文搜索引擎:QLineEdit 内容 改变
  2. \n
  3. 英文搜索引擎:QLineEdit text change
  4. \n
\n", + "tags": [ + "PyQt" + ] + }, + { + "id": "https://pyqt5.com/suggesteditor.html", + "url": "https://pyqt5.com/suggesteditor.html", + "title": "推荐编辑器LiClipse", + "date_published": "2019-05-04T10:04:08.000Z", + "content_html": "

关于 Python 的开发编辑器有很多,每个人有每个人的喜好,经常看到很多在问什么编辑器好用,有人推荐 Sublime,有人推荐 Pycharm 等等,这里就不去比较其它编辑器的优缺点了,只谈谈关于 LiClipse 这个编辑器在初级使用阶段的智能提示功能等。开箱即用,支持多种语言,RST,Markdown 和 HTML 编辑器的 HTML 预览。

\n\n

其实 LiClipse 这个编辑器就是以前的 PyDev 插件的独立版本,基于 Eclipse 编辑器开发,去掉了 Java 的相关开发功能,关于软件的详细说明可以去官网查看: http://www.liclipse.com/

\n

编辑器只需要少量的配置,打开即可使用,快速自动 import,也可以根据需要安装自己所需的插件,比如 json、svn、主题插件等。个人推荐:适合刚入门的新手使用

\n

由于新版的 PyQt 和 PyDev 去掉了详细的函数提示,所以 PyQt 的智能提示只有函数和返回值,并没有英文注释,但是以前的比如 PyQt4 的智能提示应该是有详细的英文注释提示。

\n

# 界面预览

\n
    \n
  1. 主界面
    \n\"editor1\"
  2. \n
  3. 鼠标悬停提示
    \n\"editor2\"
  4. \n
  5. 输入提示
    \n\"editor3\"
  6. \n
  7. Git 面板
    \n\"editor4\"
  8. \n
  9. 全局搜索(Ctrl + H)
    \n\"editor5\"
    \n\"editor6\"
  10. \n
\n

# 自动导包

\n

其实这个功能我是非常喜欢的,通过按下快捷键即可自动寻找包名导入,快捷键 Ctrl + Shift + O

\n

\"editor_import\"

\n

也可以在标红的代码上按下 Ctrl + F1 进行导入

\n

\"editor_import2\"

\n

# 配置

\n

打开编辑器后首先要配置【Window -> Preferences】的就是 Python 的环境变量,可以同时添加多个 Python 版本

\n

\"editor_env\"

\n

# Tab 等设置

\n
    \n
  1. Insert spaces for tabs tab 转空格
  2. \n
  3. Show line numbers 显示行号
  4. \n
\n

\"editor_tab\"

\n

# 模版

\n

这个功能可以快速插入自己定义好的模版代码,比如 if __name__ == '__main__': 等等,比如我这里配置的创建文件的模版

\n

\"editor_tpl\"

\n

# 常用快捷键

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
格式化对齐Ctrl + Shift + F
自动导包Ctrl + Shift + O
快捷提示Alt + /
\n", + "tags": [ + "编辑器" + ] + }, + { + "id": "https://pyqt5.com/bindsignals.html", + "url": "https://pyqt5.com/bindsignals.html", + "title": "三种方式绑定信号槽", + "date_published": "2019-05-04T08:07:06.000Z", + "content_html": "

网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
\n这几种方式各有各的优点和缺点。

\n\n

# 方式一

\n

这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectNameQtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
\n比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:

\n
self.pushButton = QtWidgets.QPushButton(Form)\nself.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))\nself.pushButton.setObjectName(\"pushButton\")\n\n# 通过这里自动完成连接信号槽\nQtCore.QMetaObject.connectSlotsByName(Form)
\n

此时只需要继承该 UI 文件类然后增加如下方法:

\n
\n@pyqtSlot()\ndef on_pushButton_clicked(self):\n    print('button clicked')
\n

这里解释一下, @pyqtSlot() 装饰器把函数 on_pushButton_clicked 包装为一个槽函数,
\n而 QtCore.QMetaObject.connectSlotsByName(Form) 这句代码的意思就是自动去寻找满足的槽函数

\n

注意:这里有个规范(on_xxxx_clicked),这里必须要满足 on_控件的objectName_控件的信号 这样下划线连接起来的函数名才能被识别,
\n比如按钮的点击: on_pushButton_clicked 、勾选框的选中: on_checkbox_toggled(self, checked)

\n

# 方式二

\n

这种方式则直接通过代码里调用控件的信号的 connect 方法来进行绑定,比如:

\n
# 按钮点击函数\ndef doClicked(self):\n    print(self.sender(), 'clicked')\n\n# 绑定点击信号\nself.pushButton.clicked.connect(self.doClicked)
\n

注意: connect 的是函数名字self.sender() 这句代码是获取信号发送者(比如这里就是得到这个按钮对象),
\n用处在于有时候要循环创建一堆按钮

\n

# 方式三

\n

通过参数这种方式其实比较特殊,在 PyQt 中大部分存在,但是在 PySide 中则很少,原因是两者的封装方式不同。

\n

同时该方式用于在纯代码中比较常见,而且需要对该控件有那些信号可以用要很熟习,比如:

\n
\n# 按钮点击函数\ndef doClicked(self):\n    print(self.sender(), 'clicked')\n\npushButton = QPushButton('按钮', self, clicked=self.doClicked, minimumHeight=40)
\n

这里可以通过参数(信号名字) = 函数来绑定信号

\n

同时也可以设置其它参数,比如
\n button.setMinimumHeight(40) 也可以像参数里那样设置 minimumHeight=40

\n", + "tags": [ + "PyQt", + "信号" + ] + }, + { + "id": "https://pyqt5.com/virtualenvpy_625781186.html", + "url": "https://pyqt5.com/virtualenvpy_625781186.html", + "title": "python 拷贝虚拟环境(一)  ", + "date_published": "2019-05-02T07:21:01.000Z", + "content_html": "

通常来说,刚开始使用 python 的时候都是把包装到全局路径,随着各个项目安装的包越来越多,之后每开始一个项目,pycharm 创建索引的时间都越来越漫长,所以不可避免得开始使用虚拟环境。
\n经过一番了解 ,虚拟环境的优点有这些:

\n
    \n
  • 改善 pycharm 索引时间;
  • \n
  • 各个项目的库不会冲突;
  • \n
  • 理论上虚拟环境可以给同版本的操作系统使用 (未试验过);
  • \n
  • pip freeze > requestment.txt 导出的依赖清晰;
  • \n
  • 各个版本的 python 共存;
  • \n
  • \n
\n\n

python 虚拟环境库除了自带的 venv , 还有三方库 virtualenv , 此外 在 virtualenv 基础上又开发了 virtualenvwrapper(virtualenvwrapper_win) 来管理

\n

本文基于 virtualenvwrapper 创建的虚拟环境来讲解.

\n
以下是收集的一些virtualenvwrapper配置教程:\n# linux平台\nhttps://www.cnblogs.com/netfoxman/p/5994697.html\n# window平台\nhttps://blog.csdn.net/shaququ/article/details/54292043   \nhttps://blog.csdn.net/iaau0908/article/details/54021518\n
\n

虚拟环境创建多了我们就会发现,
\n 有时候使用相同版本的环境,一些常用的库是需要重新安装的,
\n 那么能不能创建一个基础环境,默认拥有这些库,然后在这个基础环境上继续安装三方库呢?

\n

本文经过试验发现是可行的:

\n
    \n
  1. \n

    创建基础虚拟环境 mkvirtualenv <环境名称> [-p空格python其他版本的解释器路径] . 例如 mkvirtualenv py34 -p c:\\Python34\\python.exe

    \n
  2. \n
  3. \n

    切换到虚拟环境 workon py34 , 然后安装一下三方库,然后复制 py34 这个文件夹备份一下;

    \n
  4. \n
  5. \n

    接着复制这个 py34 文件夹,把复制后的文件夹改名为我们需要需要的文件夹例如 new34

    \n
  6. \n
  7. \n

    进入 new34文件夹 ,用任意编辑器全路径搜索 py34 (替换虚拟环境的路径)

    \n
  8. \n
  9. \n

    删除 new34/Scripts 下的 pip.exe, pip3.exe, pip3.x.exe, easy_install.exe (因为安装路径硬编码到这里面了,改不了,需要重新安装)

    \n
  10. \n
  11. \n

    https://blog.csdn.net/douniwan007009/article/details/81463958 按方式二,源码安装 setuptools 后再用 easy_install pip 安装 pip 后,完成;
    \n 如果有问题,就继续按照方式一的源码安装 pip;

    \n
  12. \n
  13. \n

    new34 环境下 用 pip show 三方库 来看一些库的位置,确保正确.

    \n
  14. \n
\n", + "tags": [ + "Python", + "virtualenvwrapper", + "virtualenv" + ] + }, + { + "id": "https://pyqt5.com/runnablesignal_625781186.html", + "url": "https://pyqt5.com/runnablesignal_625781186.html", + "title": "QRunnable线程池发信号", + "date_published": "2019-04-30T07:58:09.000Z", + "content_html": "

因为只有继承 QObject 的类才能有信号和自定义信号,而 QRunnable 并不是继承自 QObject ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。

\n\n

pools 是 QThreadPool 实例

\n

# 看图说话

\n
    \n
  1. \"runnablesignal1\"
  2. \n
  3. 定义一个全局信号类
    \n\"runnablesignal2\"
  4. \n
  5. 在 QRunnable 中发送
    \n\"runnablesignal3\"
  6. \n
\n", + "tags": [ + "PyQt", + "信号", + "线程" + ] + }, + { + "id": "https://pyqt5.com/viewpyindesigner_625781186.html", + "url": "https://pyqt5.com/viewpyindesigner_625781186.html", + "title": "如何和设计师中查看ui转换的py代码", + "date_published": "2019-04-30T05:11:09.000Z", + "content_html": "

通过 设计师  查看 ui 转换的 py 代码

\n

当初我刚学 pyqt 的时候,也有很多疑惑,用什么属性把控件加到布局,改了这个属性会发生什么,为什么这个会这样,那个会那样 。。。 。。。

\n

后来就看 ui 转成的 py 代码,注释一下,什么效果消失了,就是那个 api 引起的 。

\n\n

再来后发现了官方文档,查一查函数就行了 .

\n

但是有些 api 文档找起来麻烦,用设计师点几下就行了,然后把转换出来的代码拷贝一下就完事了.

\n

可是需要单独把 ui 转为 py 文件,之后再删除这个文件也是很烦的一件事 .

\n

好,话不多说,接下来手把手教你如何快速在 ui 中查看 py 代码 .

\n

官方也考虑过这种情况,所以 设计师中 是有这个功能的,但是 qt 的是没问题的,pyqt 的毕竟是绑定过来的,所以正常来说 你点击之后会弹出一个找不到应用程序的提示 .

\n

看到这个东西是不是很眼熟,我们用的命令 pyuic5 和这个东西应该是一样的 .

\n

\"viewpyindesigner1\"

\n

所以接下来,我们找找电脑上有没有这个东西

\n

\"viewpyindesigner2\"

\n

果然在 pyqt5-toos 文件夹下有这个东西,

\n

我们根据第一张图的提示,把这个东西拷贝到相应的目录 (如果没有那个 bin 文件夹,手动创建),

\n

\"viewpyindesigner3\"

\n

好了,大功告成!

\n", + "tags": [ + "PyQt", + "Designer", + "设计师" + ] + }, + { + "id": "https://pyqt5.com/showframe.html", + "url": "https://pyqt5.com/showframe.html", + "title": "PyQt5调整窗口显示边框", + "date_published": "2019-04-26T14:19:26.000Z", + "content_html": "

windows 某些场景下调整窗口大小或者移动后就会导致里面的内容重绘(速度慢,卡顿,闪烁),其实在以前 windows 在低配置设备为了减少这种频繁绘制的情况,默认会开启这种效果,不过目前设备越来越好了就关闭了该功能。具体是在控制面板中 -> 调整 Windows 的外观和性能 -> 去掉勾选 拖动时显示窗口内容。

\n\n

由于这个开关是全局状态的,而我们只需要在自己的窗口中实现该效果有两种方式。

\n
    \n
  1. 一种是自己绘制一个边框效果,放开鼠标时才操作真正的窗口。
  2. \n
  3. 二是替换窗口的处理过程函数 wndproc 处理 WM_NCLBUTTONDOWN 消息事件。
  4. \n
\n

今天讲第二种方法:

\n
    \n
  1. 需要了解 SystemParametersInfo  API 函数
  2. \n
  3. SPI_GETDRAGFULLWINDOWS :确定是否允许拖拉到最大窗口
  4. \n
  5. SPI_SETDRAGFULLWINDOWS :设置是否允许拖至最大窗口
  6. \n
\n

效果就是这样的:

\n

\"ShowFrameWhenDrag\"

\n

正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在移动的时候出现闪烁的现象。

\n

# 代码

\n

https://github.com/PyQt5/PyQt/blob/master/Demo/ShowFrameWhenDrag.py

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年4月23日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: ShowFrameWhenDrag\n@description: 调整窗口显示边框\n\"\"\"\nfrom ctypes import sizeof, windll, c_int, byref, c_long, c_void_p, c_ulong, c_longlong,\\\n    c_ulonglong, WINFUNCTYPE, c_uint\n\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel\n\n\n__Author__ = 'Irony'\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\nif sizeof(c_long) == sizeof(c_void_p):\n    WPARAM = c_ulong\n    LPARAM = c_long\nelif sizeof(c_longlong) == sizeof(c_void_p):\n    WPARAM = c_ulonglong\n    LPARAM = c_longlong\n\nWM_NCLBUTTONDOWN = 0x00a1\nGWL_WNDPROC = -4\nSPI_GETDRAGFULLWINDOWS = 38\nSPI_SETDRAGFULLWINDOWS = 37\nWNDPROC = WINFUNCTYPE(c_long, c_void_p, c_uint, WPARAM, LPARAM)\n\ntry:\n    CallWindowProc = windll.user32.CallWindowProcW\n    SetWindowLong = windll.user32.SetWindowLongW\n    SystemParametersInfo = windll.user32.SystemParametersInfoW\nexcept:\n    CallWindowProc = windll.user32.CallWindowProcA\n    SetWindowLong = windll.user32.SetWindowLongA\n    SystemParametersInfo = windll.user32.SystemParametersInfoA\n\n\ndef GetDragFullwindows():\n    rv = c_int()\n    SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, byref(rv), 0)\n    return rv.value\n\n\ndef SetDragFullwindows(value):\n    SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, value, 0, 0)\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        layout.addWidget(QLabel('拖动或者调整窗口试试看'))\n\n        # 重点替换窗口处理过程\n        self._newwndproc = WNDPROC(self._wndproc)\n        self._oldwndproc = SetWindowLong(\n            int(self.winId()), GWL_WNDPROC, self._newwndproc)\n\n    def _wndproc(self, hwnd, msg, wparam, lparam):\n        if msg == WM_NCLBUTTONDOWN:\n            # 获取系统本身是否已经开启\n            isDragFullWindow = GetDragFullwindows()\n            if isDragFullWindow != 0:\n                # 开启虚线框\n                SetDragFullwindows(0)\n                # 系统本身处理\n                ret = CallWindowProc(\n                    self._oldwndproc, hwnd, msg, wparam, lparam)\n                # 关闭虚线框\n                SetDragFullwindows(1)\n                return ret\n        return CallWindowProc(self._oldwndproc, hwnd, msg, wparam, lparam)\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 片尾

\n

替换窗口过程可以处理很多系统窗口的处理过程,更多需要读者自行去发现。

\n", + "tags": [ + "PyQt", + "边框" + ] + }, + { + "id": "https://pyqt5.com/issignalconnected.html", + "url": "https://pyqt5.com/issignalconnected.html", + "title": "PyQt5判断信号是否连接", + "date_published": "2019-04-26T14:06:26.000Z", + "content_html": "

PyQt 中某些情况下需要取消原来的信号连接,此时需要使用 disconnect 方法,但是在逻辑不严谨的情况下可能会导致多次调用 disconnect 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过  isSignalConnected  来判断信号是否连接。

\n\n

在 QOjbect 文档中这样写到:

\n
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);\nif (isSignalConnected(valueChangedSignal)) {\n    QByteArray data;\n    data = get_the_value();       // expensive operation\n    emit valueChanged(data);\n}
\n

通过直接传入信号就行了,但是这在 PyQt 中不可行。需要这么做

\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCreated on 2019年2月24日\n@author: Irony\n@site: https://pyqt5.com https://github.com/892768447\n@email: 892768447@qq.com\n@file: IsSignalConnected\n@description: 判断信号是否连接\n\"\"\"\n\nfrom PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QTextBrowser\n\n\n__Author__ = \"\"\"By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com\"\"\"\n__Copyright__ = 'Copyright (c) 2019 Irony'\n__Version__ = 1.0\n\n\nclass Window(QWidget):\n\n    def __init__(self, *args, **kwargs):\n        super(Window, self).__init__(*args, **kwargs)\n        layout = QVBoxLayout(self)\n        self.button1 = QPushButton('已连接', self, clicked=self.doTest)\n        self.button2 = QPushButton('未连接', self)\n        self.retView = QTextBrowser(self)\n        layout.addWidget(self.button1)\n        layout.addWidget(self.button2)\n        layout.addWidget(self.retView)\n\n    def doTest(self):\n        self.retView.append(\"\"\"\n        # button1 clicked 是否连接: %s\n        # button2 clicked 是否连接: %s\n        \"\"\" % (\n            self.isSignalConnected(self.button1, 'clicked()'),\n            self.isSignalConnected(self.button2, 'clicked()')\n        ))\n\n    def isSignalConnected(self, obj, name):\n        \"\"\"判断信号是否连接\n        :param obj:        对象\n        :param name:       信号名,如 clicked()\n        \"\"\"\n        index = obj.metaObject().indexOfMethod(name)\n        if index > -1:\n            method = obj.metaObject().method(index)\n            if method:\n                return obj.isSignalConnected(method)\n        return False\n\n\nif __name__ == '__main__':\n    import sys\n    from PyQt5.QtWidgets import QApplication\n    app = QApplication(sys.argv)\n    w = Window()\n    w.show()\n    sys.exit(app.exec_())
\n

# 效果图

\n

\"IsSignalConnected\"

\n", + "tags": [ + "PyQt", + "信号" + ] + } + ] +} \ No newline at end of file diff --git a/ffmpeghls.html b/ffmpeghls.html new file mode 100644 index 00000000..7f29a3a7 --- /dev/null +++ b/ffmpeghls.html @@ -0,0 +1,339 @@ +FFmpeg合成加密HLS记录 | PyQt + + + + + + + + + + + + + + + +

FFmpeg合成加密HLS记录

记录在某个需求中要求截图并合成加密视频文件,这里采用 FFmpeg 的管道流来实现生成 HLS 加密文件。

+ +
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2019年3月4日
+@author: Irony
+@site: https://pyqt5.com https://github.com/892768447
+@email: 892768447@qq.com
+@file: 
+@description: 
+"""
+
+from pathlib import Path
+from subprocess import Popen, PIPE
+
+
+__Author__ = """By: Irony
+QQ: 892768447
+Email: 892768447@qq.com"""
+__Copyright__ = 'Copyright (c) 2019 Irony'
+__Version__ = 1.0
+
+
+# p = Popen([r'D:\soft\ffmpeg\bin\ffmpeg.exe', '-y',
+#            '-threads', '2',
+#            '-f', 'image2pipe',
+#            '-vcodec', 'mjpeg', '-r', '24', '-i', '-',
+#            '-vcodec', 'h264', '-r', '24',
+#            #            '-encryption_scheme', 'cenc-aes-ctr',
+#            #            '-encryption_key', '617D8A125A284DF48E3C6B1866348A3F',
+#            #            '-encryption_kid', 'B326F895B6A24CC5A4DC70995728059C',
+#            r'F:\Workspace\Test\videos\video.mp4'], stdin=PIPE)
+
+p = Popen([r'D:\soft\ffmpeg\bin\ffmpeg.exe',
+           '-re',   # 按照实际帧率读取输入文件
+           '-y',        # 覆盖已存在文件
+           '-threads', '2',  # 线程数量
+           '-f', 'image2pipe',  # PIPE图片流
+           '-vcodec', 'mjpeg',  # 图片编码
+           '-r', '24',  # 帧率
+           '-i', '-',  # 指定输入流为PIPE
+           '-vcodec', 'h264',  # 输出编码
+           '-r', '24',  # 帧率
+           '-map', '0',
+#            '-crf','20',     # 降低质量
+           '-b', '720k',        # 码率
+           '-f', 'hls',
+           '-codec:v', 'libx264',
+           '-vbsf', 'h264_mp4toannexb',
+           # 指定加密密匙文件
+           '-hls_key_info_file', r'F:\Workspace\Test\videokey.info',
+           '-hls_time', '20',
+           '-hls_list_size', '0',
+           '-hls_wrap', '0',
+#            '-hls_flags', 'single_file',  # 生成单个文件(有bug)
+           r'F:\Workspace\Test\videos\playlist.m3u8'], stdin=PIPE)
+print(p)
+
+t = 1 / 24
+for i, path in enumerate(Path('frames').rglob('*.jpg')):
+    #     print(i, path)
+    p.stdin.write(open(str(path), 'rb').read())
+
+p.stdin.close()
+p.wait()
+print('ok')
文章作者: Irony
文章链接: https://pyqt5.com/ffmpeghls.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PyQt
赞助
  • 微信付
    微信付
  • 支付宝
    支付宝
\ No newline at end of file diff --git "a/files/\346\227\240\350\276\271\346\241\206\345\234\206\350\247\222\351\230\264\345\275\261.zip" "b/files/\346\227\240\350\276\271\346\241\206\345\234\206\350\247\222\351\230\264\345\275\261.zip" new file mode 100644 index 0000000000000000000000000000000000000000..3479e1cccdab2725575c8f04c08a97c2a6bc4911 GIT binary patch literal 40345 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 %vM7At>Di%AZrdOoeA zn7)>aALAHMCnTYI;hgZbmTFavd~4|E%Mc1e?a=zH)d)W^O>{vz9nNX?eX0PAIomT;0X$>4))()mmT z*7=Hc5yrG+sT*xBga#9vzl1Kg9hf6voQSd8RJ5A#63-V1ZI6UM^_vPTU3 zO}kT|g{FNPsqp4PP1k8fDYp0fpLvx7)i%(G0tszud`Hm56MWSj*kllj>^X@))&*-0 zNI(2o;f3S`szV_g^CyMnexS8|SG+ohbQ;rl)y%ZHb8p!26|sCizAR7w1YELH8HZyq zGHHLW40Dz1#4o(wc(G=4(z5*JyQ1LNjtS!%1u zMhmIioRlT6F;bo?4MH+7Z6$ec`Q5;B3x_g-+Vy%@`!u0ydgdywY8|`1-&<_cnxe)C zFMyn{eO`Mlf)Xq_lLjs_Q=&?_W(*f8y6@s+0_?`F)MhJlaTTyKuqdbn=w_6=Uq!T( z2bap%PzyOJBB9c&M%?@ysBd@VuLBZQ@6+m{=O+SO1M-GxK5I zyL3BF)GvB^;un=4)AnG4#W)ky&}WHoNBL+>NBoSttDnc68COq0S8D_!DjY^R9 z7M~}5L)4Ck6>&^2X&roM!crG>XyR5E3!1Vad^)v^-Dl1Z`xz&;+t;K)LwGpp!_DYIDxgypoV2Oe9ZB%MgE5i6Oh@-(T2{fj)gn<+gLh@~bBoa+U;-%D zIS~nSNjifzev&~%WAn^%B*{p-TbW}-Md3yalQijev)SX-Ce)Pkl!ZdyET1!y-Mn44 zjlvBeDcac_*vSqO$uunKNmQK%e2?jK`~_hnTs(e2Q<6tQ76o7e08aq`qz0P+|kf_vSm3qAn=wo5$Iv7}+SeZCFve>!*&4kmf z*ZDj$a%7YLVg0LrGYKD=#-cx@6CN`{Iq3hLS^4-R|1YMq`QOanSj^ggnAThW$^2LU zW==ga^O3wi<~)vW_{gOH-+cO`{oj~U|N7K0H-?xv{WrG+J6Y_ z8&nbH?tq8O3IHH+{S(yscP9UI*z9q-|7W-Vjm-Whw)MB`ef=YXKdy&^cmC0xqOpJU zZ}$Hg68oFI>GJ={{wFf_H=EXziT{u9iB0-{^pqO^A61e^ee5IvfcAKHKhADf+Mnt_ E0J*?go&W#< literal 0 HcmV?d00001 diff --git "a/files/\350\260\203\347\224\250java\347\224\237\346\210\220\346\212\245\350\241\250.7z" "b/files/\350\260\203\347\224\250java\347\224\237\346\210\220\346\212\245\350\241\250.7z" new file mode 100644 index 0000000000000000000000000000000000000000..a69a05e2bc8e56e8420c811c2d3b7b2b4952434f GIT binary patch literal 9381900 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ℜ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 YK5oZE)YUX5Ls8fpiGx^UPPzFg4gw;T$L?e*;ux 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 z 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

N+$ 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

q7F3+_@)3gd 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