[{"data":1,"prerenderedAt":3685},["ShallowReactive",2],{"post-2025-07-15-pyqt5-pyqt5":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":15,"_type":3679,"_id":3680,"_source":3681,"_file":3682,"_stem":3683,"_extension":3684},"\u002Fblog\u002F2025-07-15-pyqt5-pyqt5","blog",false,"","PyQt5-快速入门","PyQt5快速入门，了解PyQt5模块基本用法与第一个窗口程序。","2025-07-15",[12,13,14],"Python","PyQt5","GUI",{"type":16,"children":17,"toc":3670},"root",[18,27,31,37,63,86,92,95,103,108,148,161,188,196,209,244,249,268,277,282,344,349,352,357,390,402,408,411,417,438,443,466,471,580,585,593,612,635,643,661,684,706,792,797,823,886,891,936,941,955,980,985,1002,1081,1086,1118,1164,1169,1186,1281,1286,1289,1295,1300,1328,1336,1360,1396,1401,1488,1496,1520,1550,1554,1635,1641,1674,1830,1836,1853,1948,1954,1971,2117,2122,2192,2197,2258,2263,2277,2282,2285,2290,2331,2370,2375,2388,2402,2429,2492,2497,2500,2505,2523,2528,2538,2630,2636,2660,2707,2726,2769,2774,2965,2971,2995,3024,3137,3142,3388,3393,3636,3664],{"type":19,"tag":20,"props":21,"children":23},"element","h3",{"id":22},"qt简介",[24],{"type":25,"value":26},"text","Qt简介",{"type":19,"tag":28,"props":29,"children":30},"hr",{},[],{"type":19,"tag":32,"props":33,"children":34},"p",{},[35],{"type":25,"value":36},"Qt是由 C++ 底层实现的，它支持的操作系统很多，如Windows、Linux、Unix、Android、iOS、嵌入式等等，而 PyQt 是由 Python 调用 Qt 实现的，PyQt 由 Riverbank Computing 开发，采用以下许可：",{"type":19,"tag":38,"props":39,"children":40},"ul",{},[41,53],{"type":19,"tag":42,"props":43,"children":44},"li",{},[45,51],{"type":19,"tag":46,"props":47,"children":48},"strong",{},[49],{"type":25,"value":50},"GPLv3",{"type":25,"value":52},"：开源版本使用此协议，要求衍生作品也采用 GPLv3。",{"type":19,"tag":42,"props":54,"children":55},{},[56,61],{"type":19,"tag":46,"props":57,"children":58},{},[59],{"type":25,"value":60},"商业许可",{"type":25,"value":62},"：用于闭源或商业应用，需向 Riverbank Computing 购买许可证。",{"type":19,"tag":32,"props":64,"children":65},{},[66,68,77,79],{"type":25,"value":67},"Python 官方 Wiki 中关于 PyQt 的介绍：",{"type":19,"tag":69,"props":70,"children":74},"a",{"href":71,"rel":72},"https:\u002F\u002Fwiki.python.org\u002Fmoin\u002FPyQt",[73],"nofollow",[75],{"type":25,"value":76},"PyQt - Python Wiki",{"type":25,"value":78},"\nQt官方网站：",{"type":19,"tag":69,"props":80,"children":83},{"href":81,"rel":82},"https:\u002F\u002Fdoc.qt.io\u002F",[73],[84],{"type":25,"value":85},"Qt Documentation | Home",{"type":19,"tag":20,"props":87,"children":89},{"id":88},"pyqt环境准备",[90],{"type":25,"value":91},"PyQt环境准备",{"type":19,"tag":28,"props":93,"children":94},{},[],{"type":19,"tag":32,"props":96,"children":97},{},[98],{"type":19,"tag":46,"props":99,"children":100},{},[101],{"type":25,"value":102},"创建虚拟环境（可选）",{"type":19,"tag":32,"props":104,"children":105},{},[106],{"type":25,"value":107},"在dos命令窗中导航到想要创建虚拟环境的目录，执行创建虚拟环境命令：",{"type":19,"tag":109,"props":110,"children":114},"pre",{"className":111,"code":112,"language":113,"meta":7,"style":7},"language-shell shiki shiki-themes github-dark","python -m venv 环境名称\n","shell",[115],{"type":19,"tag":116,"props":117,"children":118},"code",{"__ignoreMap":7},[119],{"type":19,"tag":120,"props":121,"children":124},"span",{"class":122,"line":123},"line",1,[125,131,137,143],{"type":19,"tag":120,"props":126,"children":128},{"style":127},"--shiki-default:#B392F0",[129],{"type":25,"value":130},"python",{"type":19,"tag":120,"props":132,"children":134},{"style":133},"--shiki-default:#79B8FF",[135],{"type":25,"value":136}," -m",{"type":19,"tag":120,"props":138,"children":140},{"style":139},"--shiki-default:#9ECBFF",[141],{"type":25,"value":142}," venv",{"type":19,"tag":120,"props":144,"children":145},{"style":139},[146],{"type":25,"value":147}," 环境名称\n",{"type":19,"tag":32,"props":149,"children":150},{},[151,153,159],{"type":25,"value":152},"此处我以环境名为",{"type":19,"tag":116,"props":154,"children":156},{"className":155},[],[157],{"type":25,"value":158},"py3_qt_test",{"type":25,"value":160},"为例：",{"type":19,"tag":109,"props":162,"children":164},{"className":111,"code":163,"language":113,"meta":7,"style":7},"python -m venv py3_qt_test\n",[165],{"type":19,"tag":116,"props":166,"children":167},{"__ignoreMap":7},[168],{"type":19,"tag":120,"props":169,"children":170},{"class":122,"line":123},[171,175,179,183],{"type":19,"tag":120,"props":172,"children":173},{"style":127},[174],{"type":25,"value":130},{"type":19,"tag":120,"props":176,"children":177},{"style":133},[178],{"type":25,"value":136},{"type":19,"tag":120,"props":180,"children":181},{"style":139},[182],{"type":25,"value":142},{"type":19,"tag":120,"props":184,"children":185},{"style":139},[186],{"type":25,"value":187}," py3_qt_test\n",{"type":19,"tag":32,"props":189,"children":190},{},[191],{"type":19,"tag":46,"props":192,"children":193},{},[194],{"type":25,"value":195},"安装PyQt5库命令",{"type":19,"tag":32,"props":197,"children":198},{},[199,201,207],{"type":25,"value":200},"创建好虚拟环境后直接在当前目录下安装所需的",{"type":19,"tag":116,"props":202,"children":204},{"className":203},[],[205],{"type":25,"value":206},"pyqt5",{"type":25,"value":208},"库：",{"type":19,"tag":109,"props":210,"children":212},{"className":111,"code":211,"language":113,"meta":7,"style":7},"pip install pyqt5 -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\u002F\n",[213],{"type":19,"tag":116,"props":214,"children":215},{"__ignoreMap":7},[216],{"type":19,"tag":120,"props":217,"children":218},{"class":122,"line":123},[219,224,229,234,239],{"type":19,"tag":120,"props":220,"children":221},{"style":127},[222],{"type":25,"value":223},"pip",{"type":19,"tag":120,"props":225,"children":226},{"style":139},[227],{"type":25,"value":228}," install",{"type":19,"tag":120,"props":230,"children":231},{"style":139},[232],{"type":25,"value":233}," pyqt5",{"type":19,"tag":120,"props":235,"children":236},{"style":133},[237],{"type":25,"value":238}," -i",{"type":19,"tag":120,"props":240,"children":241},{"style":139},[242],{"type":25,"value":243}," https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\u002F\n",{"type":19,"tag":32,"props":245,"children":246},{},[247],{"type":25,"value":248},"安装完成后可以查看模块安装列表，检查是否安装成功，检查安装列表命令如下：",{"type":19,"tag":109,"props":250,"children":252},{"className":111,"code":251,"language":113,"meta":7,"style":7},"pip list\n",[253],{"type":19,"tag":116,"props":254,"children":255},{"__ignoreMap":7},[256],{"type":19,"tag":120,"props":257,"children":258},{"class":122,"line":123},[259,263],{"type":19,"tag":120,"props":260,"children":261},{"style":127},[262],{"type":25,"value":223},{"type":19,"tag":120,"props":264,"children":265},{"style":139},[266],{"type":25,"value":267}," list\n",{"type":19,"tag":32,"props":269,"children":270},{},[271],{"type":19,"tag":272,"props":273,"children":276},"img",{"alt":274,"src":275},"Pasted image 20250710104754","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250710104754.png",[],{"type":19,"tag":32,"props":278,"children":279},{},[280],{"type":25,"value":281},"也可以在当前安装PyQt的虚拟环境中执行包含如下的测试代码文件：",{"type":19,"tag":109,"props":283,"children":286},{"className":284,"code":285,"language":130,"meta":7,"style":7},"language-python shiki shiki-themes github-dark","# 若能能够正常执行，则表明环境搭建成功\nfrom PyQt5 import QtWidgets\n\n# 可以查看PyQt版本信息\nfrom PyQt5.QtCore import *\nprint(QT_VERSION_STR)\n",[287],{"type":19,"tag":116,"props":288,"children":289},{"__ignoreMap":7},[290,298,307,317,326,335],{"type":19,"tag":120,"props":291,"children":292},{"class":122,"line":123},[293],{"type":19,"tag":120,"props":294,"children":295},{},[296],{"type":25,"value":297},"# 若能能够正常执行，则表明环境搭建成功\n",{"type":19,"tag":120,"props":299,"children":301},{"class":122,"line":300},2,[302],{"type":19,"tag":120,"props":303,"children":304},{},[305],{"type":25,"value":306},"from PyQt5 import QtWidgets\n",{"type":19,"tag":120,"props":308,"children":310},{"class":122,"line":309},3,[311],{"type":19,"tag":120,"props":312,"children":314},{"emptyLinePlaceholder":313},true,[315],{"type":25,"value":316},"\n",{"type":19,"tag":120,"props":318,"children":320},{"class":122,"line":319},4,[321],{"type":19,"tag":120,"props":322,"children":323},{},[324],{"type":25,"value":325},"# 可以查看PyQt版本信息\n",{"type":19,"tag":120,"props":327,"children":329},{"class":122,"line":328},5,[330],{"type":19,"tag":120,"props":331,"children":332},{},[333],{"type":25,"value":334},"from PyQt5.QtCore import *\n",{"type":19,"tag":120,"props":336,"children":338},{"class":122,"line":337},6,[339],{"type":19,"tag":120,"props":340,"children":341},{},[342],{"type":25,"value":343},"print(QT_VERSION_STR)\n",{"type":19,"tag":20,"props":345,"children":347},{"id":346},"模块介绍",[348],{"type":25,"value":346},{"type":19,"tag":28,"props":350,"children":351},{},[],{"type":19,"tag":32,"props":353,"children":354},{},[355],{"type":25,"value":356},"PyQt中存在非常多的功能模块，开发中最常用的功能模块主要由三个：",{"type":19,"tag":38,"props":358,"children":359},{},[360,370,380],{"type":19,"tag":42,"props":361,"children":362},{},[363,368],{"type":19,"tag":46,"props":364,"children":365},{},[366],{"type":25,"value":367},"QtCore",{"type":25,"value":369},"：包含了核心的非GUI的功能，主要和时间、文件与文件夹、各种数据流、URLs、mime类文件、进程、线程等一起使用",{"type":19,"tag":42,"props":371,"children":372},{},[373,378],{"type":19,"tag":46,"props":374,"children":375},{},[376],{"type":25,"value":377},"QtGui",{"type":25,"value":379},"：包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类",{"type":19,"tag":42,"props":381,"children":382},{},[383,388],{"type":19,"tag":46,"props":384,"children":385},{},[386],{"type":25,"value":387},"QtWidgets",{"type":25,"value":389},"：包含了一些列创建桌面应用的UI元素",{"type":19,"tag":32,"props":391,"children":392},{},[393,395],{"type":25,"value":394},"Qt5的官方参考文档： ",{"type":19,"tag":69,"props":396,"children":399},{"href":397,"rel":398},"https:\u002F\u002Fdoc.qt.io\u002Farchives\u002Fqt-5.15\u002F",[73],[400],{"type":25,"value":401},"Qt 5.15",{"type":19,"tag":20,"props":403,"children":405},{"id":404},"基本ui",[406],{"type":25,"value":407},"基本UI",{"type":19,"tag":28,"props":409,"children":410},{},[],{"type":19,"tag":412,"props":413,"children":415},"h4",{"id":414},"新建一个窗口",[416],{"type":25,"value":414},{"type":19,"tag":32,"props":418,"children":419},{},[420,422,428,430,436],{"type":25,"value":421},"首先创建一个QApplication对象（只要是Qt制作的app，必须有且只有一个QApplication对象，",{"type":19,"tag":116,"props":423,"children":425},{"className":424},[],[426],{"type":25,"value":427},"sys.argv",{"type":25,"value":429}," 当作参数的目的是将运行时的命令参数传递给QApplication对象），再使用创建窗口的",{"type":19,"tag":116,"props":431,"children":433},{"className":432},[],[434],{"type":25,"value":435},"QWidget()",{"type":25,"value":437},"方法创建窗口，在创建前需要导入需要的模块及方法，如下代码案例：",{"type":19,"tag":32,"props":439,"children":440},{},[441],{"type":25,"value":442},"首先进行导包：",{"type":19,"tag":109,"props":444,"children":446},{"className":284,"code":445,"language":130,"meta":7,"style":7},"import sys\nfrom PyQt5.QtWidgets import QApplication,QWidget\n",[447],{"type":19,"tag":116,"props":448,"children":449},{"__ignoreMap":7},[450,458],{"type":19,"tag":120,"props":451,"children":452},{"class":122,"line":123},[453],{"type":19,"tag":120,"props":454,"children":455},{},[456],{"type":25,"value":457},"import sys\n",{"type":19,"tag":120,"props":459,"children":460},{"class":122,"line":300},[461],{"type":19,"tag":120,"props":462,"children":463},{},[464],{"type":25,"value":465},"from PyQt5.QtWidgets import QApplication,QWidget\n",{"type":19,"tag":32,"props":467,"children":468},{},[469],{"type":25,"value":470},"创建第一个Qt程序：",{"type":19,"tag":109,"props":472,"children":474},{"className":284,"code":473,"language":130,"meta":7,"style":7},"if __name__ == '__main__':  \n    # 创建一个应用实例  \n    app = QApplication(sys.argv)  # argv用来获取命令行参数列表\n    # 创建一个窗口  \n    w = QWidget()  \n    # 设置窗口标题  \n    w.setWindowTitle('第一个PyQt5程序')  \n    # 展示窗口  \n    w.show()  \n  \n    # 程序进行循环等待状态，直到用户关闭窗口  \n    app.exec_()  # 等同于tkinter的mainloop()\n",[475],{"type":19,"tag":116,"props":476,"children":477},{"__ignoreMap":7},[478,486,494,502,510,518,526,535,544,553,562,571],{"type":19,"tag":120,"props":479,"children":480},{"class":122,"line":123},[481],{"type":19,"tag":120,"props":482,"children":483},{},[484],{"type":25,"value":485},"if __name__ == '__main__':  \n",{"type":19,"tag":120,"props":487,"children":488},{"class":122,"line":300},[489],{"type":19,"tag":120,"props":490,"children":491},{},[492],{"type":25,"value":493},"    # 创建一个应用实例  \n",{"type":19,"tag":120,"props":495,"children":496},{"class":122,"line":309},[497],{"type":19,"tag":120,"props":498,"children":499},{},[500],{"type":25,"value":501},"    app = QApplication(sys.argv)  # argv用来获取命令行参数列表\n",{"type":19,"tag":120,"props":503,"children":504},{"class":122,"line":319},[505],{"type":19,"tag":120,"props":506,"children":507},{},[508],{"type":25,"value":509},"    # 创建一个窗口  \n",{"type":19,"tag":120,"props":511,"children":512},{"class":122,"line":328},[513],{"type":19,"tag":120,"props":514,"children":515},{},[516],{"type":25,"value":517},"    w = QWidget()  \n",{"type":19,"tag":120,"props":519,"children":520},{"class":122,"line":337},[521],{"type":19,"tag":120,"props":522,"children":523},{},[524],{"type":25,"value":525},"    # 设置窗口标题  \n",{"type":19,"tag":120,"props":527,"children":529},{"class":122,"line":528},7,[530],{"type":19,"tag":120,"props":531,"children":532},{},[533],{"type":25,"value":534},"    w.setWindowTitle('第一个PyQt5程序')  \n",{"type":19,"tag":120,"props":536,"children":538},{"class":122,"line":537},8,[539],{"type":19,"tag":120,"props":540,"children":541},{},[542],{"type":25,"value":543},"    # 展示窗口  \n",{"type":19,"tag":120,"props":545,"children":547},{"class":122,"line":546},9,[548],{"type":19,"tag":120,"props":549,"children":550},{},[551],{"type":25,"value":552},"    w.show()  \n",{"type":19,"tag":120,"props":554,"children":556},{"class":122,"line":555},10,[557],{"type":19,"tag":120,"props":558,"children":559},{},[560],{"type":25,"value":561},"  \n",{"type":19,"tag":120,"props":563,"children":565},{"class":122,"line":564},11,[566],{"type":19,"tag":120,"props":567,"children":568},{},[569],{"type":25,"value":570},"    # 程序进行循环等待状态，直到用户关闭窗口  \n",{"type":19,"tag":120,"props":572,"children":574},{"class":122,"line":573},12,[575],{"type":19,"tag":120,"props":576,"children":577},{},[578],{"type":25,"value":579},"    app.exec_()  # 等同于tkinter的mainloop()\n",{"type":19,"tag":412,"props":581,"children":583},{"id":582},"设置窗口或控件的大小",[584],{"type":25,"value":582},{"type":19,"tag":32,"props":586,"children":587},{},[588],{"type":19,"tag":46,"props":589,"children":590},{},[591],{"type":25,"value":592},"同时设置大小和位置",{"type":19,"tag":32,"props":594,"children":595},{},[596,602,604,610],{"type":19,"tag":116,"props":597,"children":599},{"className":598},[],[600],{"type":25,"value":601},"QWidget",{"type":25,"value":603}," 对象有一个 ",{"type":19,"tag":116,"props":605,"children":607},{"className":606},[],[608],{"type":25,"value":609},"setGeometry()",{"type":25,"value":611}," 方法用于同时设置窗口或控件的大小和位置，代码如下：",{"type":19,"tag":109,"props":613,"children":615},{"className":284,"code":614,"language":130,"meta":7,"style":7},"# setGeometry 的参数依次为： x,y,width,height\nw.setGeometry(20,20,300,300) # w 为QWidget对象\n",[616],{"type":19,"tag":116,"props":617,"children":618},{"__ignoreMap":7},[619,627],{"type":19,"tag":120,"props":620,"children":621},{"class":122,"line":123},[622],{"type":19,"tag":120,"props":623,"children":624},{},[625],{"type":25,"value":626},"# setGeometry 的参数依次为： x,y,width,height\n",{"type":19,"tag":120,"props":628,"children":629},{"class":122,"line":300},[630],{"type":19,"tag":120,"props":631,"children":632},{},[633],{"type":25,"value":634},"w.setGeometry(20,20,300,300) # w 为QWidget对象\n",{"type":19,"tag":32,"props":636,"children":637},{},[638],{"type":19,"tag":46,"props":639,"children":640},{},[641],{"type":25,"value":642},"设置大小",{"type":19,"tag":32,"props":644,"children":645},{},[646,651,653,659],{"type":19,"tag":116,"props":647,"children":649},{"className":648},[],[650],{"type":25,"value":601},{"type":25,"value":652}," 对象也提供了一个 ",{"type":19,"tag":116,"props":654,"children":656},{"className":655},[],[657],{"type":25,"value":658},"resize()",{"type":25,"value":660}," 方法用于设置窗口或控件的大小，代码如下：",{"type":19,"tag":109,"props":662,"children":664},{"className":284,"code":663,"language":130,"meta":7,"style":7},"# resize 的参数： width,height \nw.resize(300,300)  # w 为QWidget对象\n",[665],{"type":19,"tag":116,"props":666,"children":667},{"__ignoreMap":7},[668,676],{"type":19,"tag":120,"props":669,"children":670},{"class":122,"line":123},[671],{"type":19,"tag":120,"props":672,"children":673},{},[674],{"type":25,"value":675},"# resize 的参数： width,height \n",{"type":19,"tag":120,"props":677,"children":678},{"class":122,"line":300},[679],{"type":19,"tag":120,"props":680,"children":681},{},[682],{"type":25,"value":683},"w.resize(300,300)  # w 为QWidget对象\n",{"type":19,"tag":32,"props":685,"children":686},{},[687],{"type":19,"tag":46,"props":688,"children":689},{},[690,696,698,704],{"type":19,"tag":116,"props":691,"children":693},{"className":692},[],[694],{"type":25,"value":695},"setGeometry",{"type":25,"value":697}," 和 ",{"type":19,"tag":116,"props":699,"children":701},{"className":700},[],[702],{"type":25,"value":703},"resize",{"type":25,"value":705}," 的区别",{"type":19,"tag":707,"props":708,"children":709},"table",{},[710,733],{"type":19,"tag":711,"props":712,"children":713},"thead",{},[714],{"type":19,"tag":715,"props":716,"children":717},"tr",{},[718,725,729],{"type":19,"tag":719,"props":720,"children":722},"th",{"align":721},"center",[723],{"type":25,"value":724},"区别点",{"type":19,"tag":719,"props":726,"children":727},{"align":721},[728],{"type":25,"value":609},{"type":19,"tag":719,"props":730,"children":731},{"align":721},[732],{"type":25,"value":658},{"type":19,"tag":734,"props":735,"children":736},"tbody",{},[737,756,774],{"type":19,"tag":715,"props":738,"children":739},{},[740,746,751],{"type":19,"tag":741,"props":742,"children":743},"td",{"align":721},[744],{"type":25,"value":745},"位置控制",{"type":19,"tag":741,"props":747,"children":748},{"align":721},[749],{"type":25,"value":750},"同时设置位置和大小",{"type":19,"tag":741,"props":752,"children":753},{"align":721},[754],{"type":25,"value":755},"仅设置大小，不改变位置",{"type":19,"tag":715,"props":757,"children":758},{},[759,764,769],{"type":19,"tag":741,"props":760,"children":761},{"align":721},[762],{"type":25,"value":763},"默认位置",{"type":19,"tag":741,"props":765,"children":766},{"align":721},[767],{"type":25,"value":768},"若未调用 move()，窗口会出现在指定位置",{"type":19,"tag":741,"props":770,"children":771},{"align":721},[772],{"type":25,"value":773},"窗口默认出现在系统决定的位置（通常是屏幕左上角附近）",{"type":19,"tag":715,"props":775,"children":776},{},[777,782,787],{"type":19,"tag":741,"props":778,"children":779},{"align":721},[780],{"type":25,"value":781},"与布局管理器配合",{"type":19,"tag":741,"props":783,"children":784},{"align":721},[785],{"type":25,"value":786},"可能干扰布局管理器的自动调整",{"type":19,"tag":741,"props":788,"children":789},{"align":721},[790],{"type":25,"value":791},"更适合与布局管理器配合（仅调整内容区域大小）",{"type":19,"tag":412,"props":793,"children":795},{"id":794},"创建按钮",[796],{"type":25,"value":794},{"type":19,"tag":32,"props":798,"children":799},{},[800,805,807,813,815,821],{"type":19,"tag":116,"props":801,"children":803},{"className":802},[],[804],{"type":25,"value":387},{"type":25,"value":806},"库中提供了",{"type":19,"tag":116,"props":808,"children":810},{"className":809},[],[811],{"type":25,"value":812},"QPushButton()",{"type":25,"value":814},"方法用来创建按钮，可以通过",{"type":19,"tag":116,"props":816,"children":818},{"className":817},[],[819],{"type":25,"value":820},"QPushButton对象.信号(如click).connect(槽函数)",{"type":25,"value":822}," 的方式绑定点击事件。代码如下：",{"type":19,"tag":109,"props":824,"children":826},{"className":284,"code":825,"language":130,"meta":7,"style":7},"'''在w窗口中创建一个按钮'''\n# 创建一个按钮\nbtn = QPushButton(\"登录\")\n# 为按钮设置父控件\nbtn.setParent(w)\n# 设置按钮的位置\nbtn.move(50,100) # 也可以使用setGeometry方法\n",[827],{"type":19,"tag":116,"props":828,"children":829},{"__ignoreMap":7},[830,838,846,854,862,870,878],{"type":19,"tag":120,"props":831,"children":832},{"class":122,"line":123},[833],{"type":19,"tag":120,"props":834,"children":835},{},[836],{"type":25,"value":837},"'''在w窗口中创建一个按钮'''\n",{"type":19,"tag":120,"props":839,"children":840},{"class":122,"line":300},[841],{"type":19,"tag":120,"props":842,"children":843},{},[844],{"type":25,"value":845},"# 创建一个按钮\n",{"type":19,"tag":120,"props":847,"children":848},{"class":122,"line":309},[849],{"type":19,"tag":120,"props":850,"children":851},{},[852],{"type":25,"value":853},"btn = QPushButton(\"登录\")\n",{"type":19,"tag":120,"props":855,"children":856},{"class":122,"line":319},[857],{"type":19,"tag":120,"props":858,"children":859},{},[860],{"type":25,"value":861},"# 为按钮设置父控件\n",{"type":19,"tag":120,"props":863,"children":864},{"class":122,"line":328},[865],{"type":19,"tag":120,"props":866,"children":867},{},[868],{"type":25,"value":869},"btn.setParent(w)\n",{"type":19,"tag":120,"props":871,"children":872},{"class":122,"line":337},[873],{"type":19,"tag":120,"props":874,"children":875},{},[876],{"type":25,"value":877},"# 设置按钮的位置\n",{"type":19,"tag":120,"props":879,"children":880},{"class":122,"line":528},[881],{"type":19,"tag":120,"props":882,"children":883},{},[884],{"type":25,"value":885},"btn.move(50,100) # 也可以使用setGeometry方法\n",{"type":19,"tag":32,"props":887,"children":888},{},[889],{"type":25,"value":890},"除了上述创建控件的方式，即先创建控件再绑定父控件的方式之外，还可以直接再创建控件的同时绑定父控件，代码如下所示：",{"type":19,"tag":109,"props":892,"children":894},{"className":284,"code":893,"language":130,"meta":7,"style":7},"'''在w窗口中创建一个按钮'''\n# 创建按钮同时绑定父控件\nbtn = QPushButton(\"登录\",w)\n# 设置按钮的位置\nbtn.move(50,100)\n",[895],{"type":19,"tag":116,"props":896,"children":897},{"__ignoreMap":7},[898,905,913,921,928],{"type":19,"tag":120,"props":899,"children":900},{"class":122,"line":123},[901],{"type":19,"tag":120,"props":902,"children":903},{},[904],{"type":25,"value":837},{"type":19,"tag":120,"props":906,"children":907},{"class":122,"line":300},[908],{"type":19,"tag":120,"props":909,"children":910},{},[911],{"type":25,"value":912},"# 创建按钮同时绑定父控件\n",{"type":19,"tag":120,"props":914,"children":915},{"class":122,"line":309},[916],{"type":19,"tag":120,"props":917,"children":918},{},[919],{"type":25,"value":920},"btn = QPushButton(\"登录\",w)\n",{"type":19,"tag":120,"props":922,"children":923},{"class":122,"line":319},[924],{"type":19,"tag":120,"props":925,"children":926},{},[927],{"type":25,"value":877},{"type":19,"tag":120,"props":929,"children":930},{"class":122,"line":328},[931],{"type":19,"tag":120,"props":932,"children":933},{},[934],{"type":25,"value":935},"btn.move(50,100)\n",{"type":19,"tag":32,"props":937,"children":938},{},[939],{"type":25,"value":940},"在创建按钮控件以及其他控件时也需要导入对应的UI元素方法，如下所示：",{"type":19,"tag":109,"props":942,"children":944},{"className":284,"code":943,"language":130,"meta":7,"style":7},"from PyQt5.QtWidgets import QPushButton, QLineEdit,QLabel\n",[945],{"type":19,"tag":116,"props":946,"children":947},{"__ignoreMap":7},[948],{"type":19,"tag":120,"props":949,"children":950},{"class":122,"line":123},[951],{"type":19,"tag":120,"props":952,"children":953},{},[954],{"type":25,"value":943},{"type":19,"tag":956,"props":957,"children":958},"blockquote",{},[959],{"type":19,"tag":32,"props":960,"children":961},{},[962,964,970,972,978],{"type":25,"value":963},"以上两种创建方式也适用于",{"type":19,"tag":116,"props":965,"children":967},{"className":966},[],[968],{"type":25,"value":969},"QLineEdit",{"type":25,"value":971},"、",{"type":19,"tag":116,"props":973,"children":975},{"className":974},[],[976],{"type":25,"value":977},"QLabel",{"type":25,"value":979},"等其他的控件",{"type":19,"tag":412,"props":981,"children":983},{"id":982},"创建标签",[984],{"type":25,"value":982},{"type":19,"tag":32,"props":986,"children":987},{},[988,993,994,1000],{"type":19,"tag":116,"props":989,"children":991},{"className":990},[],[992],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":995,"children":997},{"className":996},[],[998],{"type":25,"value":999},"QLabel()",{"type":25,"value":1001},"方法用来创建按钮。代码如下：",{"type":19,"tag":109,"props":1003,"children":1005},{"className":284,"code":1004,"language":130,"meta":7,"style":7},"'''在w窗口中创建一个标签'''\n# 先创建后绑定父控件  \nuser = QLabel('账户：')  \nuser.setParent(w)  \nuser.setStyleSheet(\"font-size:16px;color:blue\") # 对组件进行属性设置\nuser.move(50,50)\n#  创建的同时并绑定父控件  \npassword = QLabel('密码：',w)\npassword.move(50,70)\n",[1006],{"type":19,"tag":116,"props":1007,"children":1008},{"__ignoreMap":7},[1009,1017,1025,1033,1041,1049,1057,1065,1073],{"type":19,"tag":120,"props":1010,"children":1011},{"class":122,"line":123},[1012],{"type":19,"tag":120,"props":1013,"children":1014},{},[1015],{"type":25,"value":1016},"'''在w窗口中创建一个标签'''\n",{"type":19,"tag":120,"props":1018,"children":1019},{"class":122,"line":300},[1020],{"type":19,"tag":120,"props":1021,"children":1022},{},[1023],{"type":25,"value":1024},"# 先创建后绑定父控件  \n",{"type":19,"tag":120,"props":1026,"children":1027},{"class":122,"line":309},[1028],{"type":19,"tag":120,"props":1029,"children":1030},{},[1031],{"type":25,"value":1032},"user = QLabel('账户：')  \n",{"type":19,"tag":120,"props":1034,"children":1035},{"class":122,"line":319},[1036],{"type":19,"tag":120,"props":1037,"children":1038},{},[1039],{"type":25,"value":1040},"user.setParent(w)  \n",{"type":19,"tag":120,"props":1042,"children":1043},{"class":122,"line":328},[1044],{"type":19,"tag":120,"props":1045,"children":1046},{},[1047],{"type":25,"value":1048},"user.setStyleSheet(\"font-size:16px;color:blue\") # 对组件进行属性设置\n",{"type":19,"tag":120,"props":1050,"children":1051},{"class":122,"line":337},[1052],{"type":19,"tag":120,"props":1053,"children":1054},{},[1055],{"type":25,"value":1056},"user.move(50,50)\n",{"type":19,"tag":120,"props":1058,"children":1059},{"class":122,"line":528},[1060],{"type":19,"tag":120,"props":1061,"children":1062},{},[1063],{"type":25,"value":1064},"#  创建的同时并绑定父控件  \n",{"type":19,"tag":120,"props":1066,"children":1067},{"class":122,"line":537},[1068],{"type":19,"tag":120,"props":1069,"children":1070},{},[1071],{"type":25,"value":1072},"password = QLabel('密码：',w)\n",{"type":19,"tag":120,"props":1074,"children":1075},{"class":122,"line":546},[1076],{"type":19,"tag":120,"props":1077,"children":1078},{},[1079],{"type":25,"value":1080},"password.move(50,70)\n",{"type":19,"tag":412,"props":1082,"children":1084},{"id":1083},"创建输入框",[1085],{"type":25,"value":1083},{"type":19,"tag":32,"props":1087,"children":1088},{},[1089,1094,1095,1101,1103,1108,1110,1116],{"type":19,"tag":116,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":25,"value":1100},"QLineEdit()",{"type":25,"value":1102},"方法用来创建输入框。可以使用",{"type":19,"tag":116,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":25,"value":969},{"type":25,"value":1109},"所提供的",{"type":19,"tag":116,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":25,"value":1115},"setPlaceholderText(str)",{"type":25,"value":1117}," 的方法，创建输入框的提示词。代码如下：",{"type":19,"tag":109,"props":1119,"children":1121},{"className":284,"code":1120,"language":130,"meta":7,"style":7},"'''在w窗口中创建一个输入框'''\n#  创建的同时并绑定父控件  \nedit = QLineEdit(w)\nedit.setPlaceholderText('请输入用户名') # 提示词\nw.move(100,50)\n",[1122],{"type":19,"tag":116,"props":1123,"children":1124},{"__ignoreMap":7},[1125,1133,1140,1148,1156],{"type":19,"tag":120,"props":1126,"children":1127},{"class":122,"line":123},[1128],{"type":19,"tag":120,"props":1129,"children":1130},{},[1131],{"type":25,"value":1132},"'''在w窗口中创建一个输入框'''\n",{"type":19,"tag":120,"props":1134,"children":1135},{"class":122,"line":300},[1136],{"type":19,"tag":120,"props":1137,"children":1138},{},[1139],{"type":25,"value":1064},{"type":19,"tag":120,"props":1141,"children":1142},{"class":122,"line":309},[1143],{"type":19,"tag":120,"props":1144,"children":1145},{},[1146],{"type":25,"value":1147},"edit = QLineEdit(w)\n",{"type":19,"tag":120,"props":1149,"children":1150},{"class":122,"line":319},[1151],{"type":19,"tag":120,"props":1152,"children":1153},{},[1154],{"type":25,"value":1155},"edit.setPlaceholderText('请输入用户名') # 提示词\n",{"type":19,"tag":120,"props":1157,"children":1158},{"class":122,"line":328},[1159],{"type":19,"tag":120,"props":1160,"children":1161},{},[1162],{"type":25,"value":1163},"w.move(100,50)\n",{"type":19,"tag":412,"props":1165,"children":1167},{"id":1166},"创建单选按钮",[1168],{"type":25,"value":1166},{"type":19,"tag":32,"props":1170,"children":1171},{},[1172,1177,1178,1184],{"type":19,"tag":116,"props":1173,"children":1175},{"className":1174},[],[1176],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":25,"value":1183},"QRadioButton()",{"type":25,"value":1185},"方法用来创建按钮，复选框的创建并不复杂，重点在于如何对这些控件进行布局排版，例如其代码如下：",{"type":19,"tag":109,"props":1187,"children":1189},{"className":284,"code":1188,"language":130,"meta":7,"style":7},"# 在w窗口添加性别复选框\nh = QHBoxLayout()  # 创建一个水平布局  \ngroup = QGroupBox('性别')  # 创建性别组  \nv = QVBoxLayout()  # 创建一个垂直布局  \nbtn1 = QRadioButton('男')  '''创建单选按钮的命令就这两句'''\nbtn2 = QRadioButton('女')  '''其他的代码都是为了布局'''\nv.addWidget(btn1)  \nv.addWidget(btn2)  \ngroup.setLayout(v)  # 将垂直布局与组绑定  \nh.addWidget(group)  \nw.setLayout(h)\n",[1190],{"type":19,"tag":116,"props":1191,"children":1192},{"__ignoreMap":7},[1193,1201,1209,1217,1225,1233,1241,1249,1257,1265,1273],{"type":19,"tag":120,"props":1194,"children":1195},{"class":122,"line":123},[1196],{"type":19,"tag":120,"props":1197,"children":1198},{},[1199],{"type":25,"value":1200},"# 在w窗口添加性别复选框\n",{"type":19,"tag":120,"props":1202,"children":1203},{"class":122,"line":300},[1204],{"type":19,"tag":120,"props":1205,"children":1206},{},[1207],{"type":25,"value":1208},"h = QHBoxLayout()  # 创建一个水平布局  \n",{"type":19,"tag":120,"props":1210,"children":1211},{"class":122,"line":309},[1212],{"type":19,"tag":120,"props":1213,"children":1214},{},[1215],{"type":25,"value":1216},"group = QGroupBox('性别')  # 创建性别组  \n",{"type":19,"tag":120,"props":1218,"children":1219},{"class":122,"line":319},[1220],{"type":19,"tag":120,"props":1221,"children":1222},{},[1223],{"type":25,"value":1224},"v = QVBoxLayout()  # 创建一个垂直布局  \n",{"type":19,"tag":120,"props":1226,"children":1227},{"class":122,"line":328},[1228],{"type":19,"tag":120,"props":1229,"children":1230},{},[1231],{"type":25,"value":1232},"btn1 = QRadioButton('男')  '''创建单选按钮的命令就这两句'''\n",{"type":19,"tag":120,"props":1234,"children":1235},{"class":122,"line":337},[1236],{"type":19,"tag":120,"props":1237,"children":1238},{},[1239],{"type":25,"value":1240},"btn2 = QRadioButton('女')  '''其他的代码都是为了布局'''\n",{"type":19,"tag":120,"props":1242,"children":1243},{"class":122,"line":528},[1244],{"type":19,"tag":120,"props":1245,"children":1246},{},[1247],{"type":25,"value":1248},"v.addWidget(btn1)  \n",{"type":19,"tag":120,"props":1250,"children":1251},{"class":122,"line":537},[1252],{"type":19,"tag":120,"props":1253,"children":1254},{},[1255],{"type":25,"value":1256},"v.addWidget(btn2)  \n",{"type":19,"tag":120,"props":1258,"children":1259},{"class":122,"line":546},[1260],{"type":19,"tag":120,"props":1261,"children":1262},{},[1263],{"type":25,"value":1264},"group.setLayout(v)  # 将垂直布局与组绑定  \n",{"type":19,"tag":120,"props":1266,"children":1267},{"class":122,"line":555},[1268],{"type":19,"tag":120,"props":1269,"children":1270},{},[1271],{"type":25,"value":1272},"h.addWidget(group)  \n",{"type":19,"tag":120,"props":1274,"children":1275},{"class":122,"line":564},[1276],{"type":19,"tag":120,"props":1277,"children":1278},{},[1279],{"type":25,"value":1280},"w.setLayout(h)\n",{"type":19,"tag":20,"props":1282,"children":1284},{"id":1283},"布局方式",[1285],{"type":25,"value":1283},{"type":19,"tag":28,"props":1287,"children":1288},{},[],{"type":19,"tag":412,"props":1290,"children":1292},{"id":1291},"盒子布局qboxlayout",[1293],{"type":25,"value":1294},"盒子布局（QBoxLayout）",{"type":19,"tag":32,"props":1296,"children":1297},{},[1298],{"type":25,"value":1299},"PyQt提供的盒子布局存在两种方式，分别是：",{"type":19,"tag":38,"props":1301,"children":1302},{},[1303,1316],{"type":19,"tag":42,"props":1304,"children":1305},{},[1306,1308,1314],{"type":25,"value":1307},"水平布局  使用",{"type":19,"tag":116,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":25,"value":1313},"QHBQoxLayout",{"type":25,"value":1315},"方法",{"type":19,"tag":42,"props":1317,"children":1318},{},[1319,1321,1327],{"type":25,"value":1320},"垂直布局  使用",{"type":19,"tag":116,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":25,"value":1326},"QVBQoxLayout",{"type":25,"value":1315},{"type":19,"tag":32,"props":1329,"children":1330},{},[1331],{"type":19,"tag":46,"props":1332,"children":1333},{},[1334],{"type":25,"value":1335},"垂直布局（QVBQoxLayout）",{"type":19,"tag":32,"props":1337,"children":1338},{},[1339,1344,1345,1351,1353,1358],{"type":19,"tag":116,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":25,"value":1350},"QVBQoxLayout()",{"type":25,"value":1352},"方法用来创建一个垂直布局，",{"type":19,"tag":116,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":25,"value":1326},{"type":25,"value":1359},"对象所提供的一些方法：",{"type":19,"tag":38,"props":1361,"children":1362},{},[1363,1374,1385],{"type":19,"tag":42,"props":1364,"children":1365},{},[1366,1372],{"type":19,"tag":116,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":25,"value":1371},"addWidget(控件对象)",{"type":25,"value":1373},"方法将控件添加入布局中",{"type":19,"tag":42,"props":1375,"children":1376},{},[1377,1383],{"type":19,"tag":116,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":25,"value":1382},"addLayout(布局对象)",{"type":25,"value":1384},"方法将其他布局嵌入当前布局中",{"type":19,"tag":42,"props":1386,"children":1387},{},[1388,1394],{"type":19,"tag":116,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":25,"value":1393},"addStretch(int)",{"type":25,"value":1395},"方法可以添加伸缩因子进行排版",{"type":19,"tag":32,"props":1397,"children":1398},{},[1399],{"type":25,"value":1400},"具体实操代码如下所示：",{"type":19,"tag":109,"props":1402,"children":1404},{"className":284,"code":1403,"language":130,"meta":7,"style":7},"layout = QVBoxLayout() # 创建一个垂直布局  \nbtn1 = QPushButton('按钮1')  \nbtn2 = QPushButton('按钮2')  \n# 以下的addSretch最终达到的效果为btn1与btn2的分布为1:2\nlayout.addWidget(btn1) # 将按钮1加入垂直布局  \nlayout.addStretch(1) # 添加一个伸缩因子  \nlayout.addWidget(btn2) # 将按钮2加入垂直布局  \nlayout.addStretch(2) # 再添加一个伸缩因子 \n# 在对垂直布局操作完成后记得为该布局添加父控件，例在w上显示垂直布局\nw.setLayout(layout)\n",[1405],{"type":19,"tag":116,"props":1406,"children":1407},{"__ignoreMap":7},[1408,1416,1424,1432,1440,1448,1456,1464,1472,1480],{"type":19,"tag":120,"props":1409,"children":1410},{"class":122,"line":123},[1411],{"type":19,"tag":120,"props":1412,"children":1413},{},[1414],{"type":25,"value":1415},"layout = QVBoxLayout() # 创建一个垂直布局  \n",{"type":19,"tag":120,"props":1417,"children":1418},{"class":122,"line":300},[1419],{"type":19,"tag":120,"props":1420,"children":1421},{},[1422],{"type":25,"value":1423},"btn1 = QPushButton('按钮1')  \n",{"type":19,"tag":120,"props":1425,"children":1426},{"class":122,"line":309},[1427],{"type":19,"tag":120,"props":1428,"children":1429},{},[1430],{"type":25,"value":1431},"btn2 = QPushButton('按钮2')  \n",{"type":19,"tag":120,"props":1433,"children":1434},{"class":122,"line":319},[1435],{"type":19,"tag":120,"props":1436,"children":1437},{},[1438],{"type":25,"value":1439},"# 以下的addSretch最终达到的效果为btn1与btn2的分布为1:2\n",{"type":19,"tag":120,"props":1441,"children":1442},{"class":122,"line":328},[1443],{"type":19,"tag":120,"props":1444,"children":1445},{},[1446],{"type":25,"value":1447},"layout.addWidget(btn1) # 将按钮1加入垂直布局  \n",{"type":19,"tag":120,"props":1449,"children":1450},{"class":122,"line":337},[1451],{"type":19,"tag":120,"props":1452,"children":1453},{},[1454],{"type":25,"value":1455},"layout.addStretch(1) # 添加一个伸缩因子  \n",{"type":19,"tag":120,"props":1457,"children":1458},{"class":122,"line":528},[1459],{"type":19,"tag":120,"props":1460,"children":1461},{},[1462],{"type":25,"value":1463},"layout.addWidget(btn2) # 将按钮2加入垂直布局  \n",{"type":19,"tag":120,"props":1465,"children":1466},{"class":122,"line":537},[1467],{"type":19,"tag":120,"props":1468,"children":1469},{},[1470],{"type":25,"value":1471},"layout.addStretch(2) # 再添加一个伸缩因子 \n",{"type":19,"tag":120,"props":1473,"children":1474},{"class":122,"line":546},[1475],{"type":19,"tag":120,"props":1476,"children":1477},{},[1478],{"type":25,"value":1479},"# 在对垂直布局操作完成后记得为该布局添加父控件，例在w上显示垂直布局\n",{"type":19,"tag":120,"props":1481,"children":1482},{"class":122,"line":555},[1483],{"type":19,"tag":120,"props":1484,"children":1485},{},[1486],{"type":25,"value":1487},"w.setLayout(layout)\n",{"type":19,"tag":32,"props":1489,"children":1490},{},[1491],{"type":19,"tag":46,"props":1492,"children":1493},{},[1494],{"type":25,"value":1495},"水平布局（QHBQoxLayout）",{"type":19,"tag":32,"props":1497,"children":1498},{},[1499,1504,1505,1511,1513,1518],{"type":19,"tag":116,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1506,"children":1508},{"className":1507},[],[1509],{"type":25,"value":1510},"QHBQoxLayout()",{"type":25,"value":1512},"方法用来创建一个水平布局，",{"type":19,"tag":116,"props":1514,"children":1516},{"className":1515},[],[1517],{"type":25,"value":1313},{"type":25,"value":1519},"对象也所提供的一些方法：",{"type":19,"tag":38,"props":1521,"children":1522},{},[1523,1532,1541],{"type":19,"tag":42,"props":1524,"children":1525},{},[1526,1531],{"type":19,"tag":116,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":25,"value":1371},{"type":25,"value":1373},{"type":19,"tag":42,"props":1533,"children":1534},{},[1535,1540],{"type":19,"tag":116,"props":1536,"children":1538},{"className":1537},[],[1539],{"type":25,"value":1382},{"type":25,"value":1384},{"type":19,"tag":42,"props":1542,"children":1543},{},[1544,1549],{"type":19,"tag":116,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":25,"value":1393},{"type":25,"value":1395},{"type":19,"tag":32,"props":1551,"children":1552},{},[1553],{"type":25,"value":1400},{"type":19,"tag":109,"props":1555,"children":1557},{"className":284,"code":1556,"language":130,"meta":7,"style":7},"layout = QHBoxLayout() # 创建一个水平布局  \nbtn1 = QPushButton('按钮1')  \nbtn2 = QPushButton('按钮2')  \n# 以下的addSretch最终达到的效果为btn1与btn2的分布为1:2\nlayout.addWidget(btn1) # 将按钮1加入水平布局  \nlayout.addStretch(1) # 添加一个伸缩因子  \nlayout.addWidget(btn2) # 将按钮2加入水平布局  \nlayout.addStretch(2) # 再添加一个伸缩因子 \n# 在对水平布局操作完成后记得为该布局添加父控件，例在w上显示水平布局\nw.setLayout(layout)\n",[1558],{"type":19,"tag":116,"props":1559,"children":1560},{"__ignoreMap":7},[1561,1569,1576,1583,1590,1598,1605,1613,1620,1628],{"type":19,"tag":120,"props":1562,"children":1563},{"class":122,"line":123},[1564],{"type":19,"tag":120,"props":1565,"children":1566},{},[1567],{"type":25,"value":1568},"layout = QHBoxLayout() # 创建一个水平布局  \n",{"type":19,"tag":120,"props":1570,"children":1571},{"class":122,"line":300},[1572],{"type":19,"tag":120,"props":1573,"children":1574},{},[1575],{"type":25,"value":1423},{"type":19,"tag":120,"props":1577,"children":1578},{"class":122,"line":309},[1579],{"type":19,"tag":120,"props":1580,"children":1581},{},[1582],{"type":25,"value":1431},{"type":19,"tag":120,"props":1584,"children":1585},{"class":122,"line":319},[1586],{"type":19,"tag":120,"props":1587,"children":1588},{},[1589],{"type":25,"value":1439},{"type":19,"tag":120,"props":1591,"children":1592},{"class":122,"line":328},[1593],{"type":19,"tag":120,"props":1594,"children":1595},{},[1596],{"type":25,"value":1597},"layout.addWidget(btn1) # 将按钮1加入水平布局  \n",{"type":19,"tag":120,"props":1599,"children":1600},{"class":122,"line":337},[1601],{"type":19,"tag":120,"props":1602,"children":1603},{},[1604],{"type":25,"value":1455},{"type":19,"tag":120,"props":1606,"children":1607},{"class":122,"line":528},[1608],{"type":19,"tag":120,"props":1609,"children":1610},{},[1611],{"type":25,"value":1612},"layout.addWidget(btn2) # 将按钮2加入水平布局  \n",{"type":19,"tag":120,"props":1614,"children":1615},{"class":122,"line":537},[1616],{"type":19,"tag":120,"props":1617,"children":1618},{},[1619],{"type":25,"value":1471},{"type":19,"tag":120,"props":1621,"children":1622},{"class":122,"line":546},[1623],{"type":19,"tag":120,"props":1624,"children":1625},{},[1626],{"type":25,"value":1627},"# 在对水平布局操作完成后记得为该布局添加父控件，例在w上显示水平布局\n",{"type":19,"tag":120,"props":1629,"children":1630},{"class":122,"line":555},[1631],{"type":19,"tag":120,"props":1632,"children":1633},{},[1634],{"type":25,"value":1487},{"type":19,"tag":412,"props":1636,"children":1638},{"id":1637},"网格布局qgridlayout",[1639],{"type":25,"value":1640},"网格布局（QGridLayout）",{"type":19,"tag":32,"props":1642,"children":1643},{},[1644,1649,1650,1656,1658,1664,1666,1672],{"type":19,"tag":116,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1651,"children":1653},{"className":1652},[],[1654],{"type":25,"value":1655},"QGridLayout()",{"type":25,"value":1657},"方法用来创建一个网格布局（也称九宫格布局），",{"type":19,"tag":116,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":25,"value":1663},"QGridLayout",{"type":25,"value":1665},"对象提供了",{"type":19,"tag":116,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":25,"value":1671},"addWidget(控件,行,列)",{"type":25,"value":1673},"方法用来向网格布局中添加内容，示例代码如下：",{"type":19,"tag":109,"props":1675,"children":1677},{"className":284,"code":1676,"language":130,"meta":7,"style":7},"h = QVBoxLayout()  \ninp = QLineEdit()  # 添加输入框  \ninp.setPlaceholderText('请输入式子')  \nh.addWidget(inp)  \nw.setWindowTitle('九宫格布局')  \ndata = {  \n    0:['7','8','9','+'],  \n    1:['4','5','6','-'],  \n    2:['1','2','3','*'],  \n    3:['.','0','=','\u002F']  \n}  \ngrid = QGridLayout()  # 创建网格布局  \nfor key,value in data.items():  \n    for i,v in enumerate(value):  \n        btn = QPushButton(v)  \n        grid.addWidget(btn,key,i)  # 添加内容\nh.addLayout( grid)  \nw.setLayout(h)\n",[1678],{"type":19,"tag":116,"props":1679,"children":1680},{"__ignoreMap":7},[1681,1689,1697,1705,1713,1721,1729,1737,1745,1753,1761,1769,1777,1786,1795,1804,1813,1822],{"type":19,"tag":120,"props":1682,"children":1683},{"class":122,"line":123},[1684],{"type":19,"tag":120,"props":1685,"children":1686},{},[1687],{"type":25,"value":1688},"h = QVBoxLayout()  \n",{"type":19,"tag":120,"props":1690,"children":1691},{"class":122,"line":300},[1692],{"type":19,"tag":120,"props":1693,"children":1694},{},[1695],{"type":25,"value":1696},"inp = QLineEdit()  # 添加输入框  \n",{"type":19,"tag":120,"props":1698,"children":1699},{"class":122,"line":309},[1700],{"type":19,"tag":120,"props":1701,"children":1702},{},[1703],{"type":25,"value":1704},"inp.setPlaceholderText('请输入式子')  \n",{"type":19,"tag":120,"props":1706,"children":1707},{"class":122,"line":319},[1708],{"type":19,"tag":120,"props":1709,"children":1710},{},[1711],{"type":25,"value":1712},"h.addWidget(inp)  \n",{"type":19,"tag":120,"props":1714,"children":1715},{"class":122,"line":328},[1716],{"type":19,"tag":120,"props":1717,"children":1718},{},[1719],{"type":25,"value":1720},"w.setWindowTitle('九宫格布局')  \n",{"type":19,"tag":120,"props":1722,"children":1723},{"class":122,"line":337},[1724],{"type":19,"tag":120,"props":1725,"children":1726},{},[1727],{"type":25,"value":1728},"data = {  \n",{"type":19,"tag":120,"props":1730,"children":1731},{"class":122,"line":528},[1732],{"type":19,"tag":120,"props":1733,"children":1734},{},[1735],{"type":25,"value":1736},"    0:['7','8','9','+'],  \n",{"type":19,"tag":120,"props":1738,"children":1739},{"class":122,"line":537},[1740],{"type":19,"tag":120,"props":1741,"children":1742},{},[1743],{"type":25,"value":1744},"    1:['4','5','6','-'],  \n",{"type":19,"tag":120,"props":1746,"children":1747},{"class":122,"line":546},[1748],{"type":19,"tag":120,"props":1749,"children":1750},{},[1751],{"type":25,"value":1752},"    2:['1','2','3','*'],  \n",{"type":19,"tag":120,"props":1754,"children":1755},{"class":122,"line":555},[1756],{"type":19,"tag":120,"props":1757,"children":1758},{},[1759],{"type":25,"value":1760},"    3:['.','0','=','\u002F']  \n",{"type":19,"tag":120,"props":1762,"children":1763},{"class":122,"line":564},[1764],{"type":19,"tag":120,"props":1765,"children":1766},{},[1767],{"type":25,"value":1768},"}  \n",{"type":19,"tag":120,"props":1770,"children":1771},{"class":122,"line":573},[1772],{"type":19,"tag":120,"props":1773,"children":1774},{},[1775],{"type":25,"value":1776},"grid = QGridLayout()  # 创建网格布局  \n",{"type":19,"tag":120,"props":1778,"children":1780},{"class":122,"line":1779},13,[1781],{"type":19,"tag":120,"props":1782,"children":1783},{},[1784],{"type":25,"value":1785},"for key,value in data.items():  \n",{"type":19,"tag":120,"props":1787,"children":1789},{"class":122,"line":1788},14,[1790],{"type":19,"tag":120,"props":1791,"children":1792},{},[1793],{"type":25,"value":1794},"    for i,v in enumerate(value):  \n",{"type":19,"tag":120,"props":1796,"children":1798},{"class":122,"line":1797},15,[1799],{"type":19,"tag":120,"props":1800,"children":1801},{},[1802],{"type":25,"value":1803},"        btn = QPushButton(v)  \n",{"type":19,"tag":120,"props":1805,"children":1807},{"class":122,"line":1806},16,[1808],{"type":19,"tag":120,"props":1809,"children":1810},{},[1811],{"type":25,"value":1812},"        grid.addWidget(btn,key,i)  # 添加内容\n",{"type":19,"tag":120,"props":1814,"children":1816},{"class":122,"line":1815},17,[1817],{"type":19,"tag":120,"props":1818,"children":1819},{},[1820],{"type":25,"value":1821},"h.addLayout( grid)  \n",{"type":19,"tag":120,"props":1823,"children":1825},{"class":122,"line":1824},18,[1826],{"type":19,"tag":120,"props":1827,"children":1828},{},[1829],{"type":25,"value":1280},{"type":19,"tag":412,"props":1831,"children":1833},{"id":1832},"表单布局qfromlayout",[1834],{"type":25,"value":1835},"表单布局（QFromLayout）",{"type":19,"tag":32,"props":1837,"children":1838},{},[1839,1844,1845,1851],{"type":19,"tag":116,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":25,"value":1850},"QFromLayout()",{"type":25,"value":1852},"方法用来创建一个表单布局，示例代码如下：",{"type":19,"tag":109,"props":1854,"children":1856},{"className":284,"code":1855,"language":130,"meta":7,"style":7},"v = QVBoxLayout()  # 创建垂直布局\nfrom_layout = QFormLayout() # 创建表单布局  \nedit1 = QLineEdit()  # 创建输入框1\nedit1.setPlaceholderText('请输入用户名')  \nfrom_layout.addRow('用户名', edit1)  # 向表单布局添加一行\nedit2 = QLineEdit()  # 创建输入框1\nedit2.setPlaceholderText('请输入密码')  \nfrom_layout.addRow('密码', edit2)  \nv.addLayout(from_layout)  # 将表单布局嵌入垂直布局\nv.addWidget(QPushButton('登录'), alignment=Qt.AlignCenter)  \nw.setLayout(v) # 将垂直布局与窗口绑定\n",[1857],{"type":19,"tag":116,"props":1858,"children":1859},{"__ignoreMap":7},[1860,1868,1876,1884,1892,1900,1908,1916,1924,1932,1940],{"type":19,"tag":120,"props":1861,"children":1862},{"class":122,"line":123},[1863],{"type":19,"tag":120,"props":1864,"children":1865},{},[1866],{"type":25,"value":1867},"v = QVBoxLayout()  # 创建垂直布局\n",{"type":19,"tag":120,"props":1869,"children":1870},{"class":122,"line":300},[1871],{"type":19,"tag":120,"props":1872,"children":1873},{},[1874],{"type":25,"value":1875},"from_layout = QFormLayout() # 创建表单布局  \n",{"type":19,"tag":120,"props":1877,"children":1878},{"class":122,"line":309},[1879],{"type":19,"tag":120,"props":1880,"children":1881},{},[1882],{"type":25,"value":1883},"edit1 = QLineEdit()  # 创建输入框1\n",{"type":19,"tag":120,"props":1885,"children":1886},{"class":122,"line":319},[1887],{"type":19,"tag":120,"props":1888,"children":1889},{},[1890],{"type":25,"value":1891},"edit1.setPlaceholderText('请输入用户名')  \n",{"type":19,"tag":120,"props":1893,"children":1894},{"class":122,"line":328},[1895],{"type":19,"tag":120,"props":1896,"children":1897},{},[1898],{"type":25,"value":1899},"from_layout.addRow('用户名', edit1)  # 向表单布局添加一行\n",{"type":19,"tag":120,"props":1901,"children":1902},{"class":122,"line":337},[1903],{"type":19,"tag":120,"props":1904,"children":1905},{},[1906],{"type":25,"value":1907},"edit2 = QLineEdit()  # 创建输入框1\n",{"type":19,"tag":120,"props":1909,"children":1910},{"class":122,"line":528},[1911],{"type":19,"tag":120,"props":1912,"children":1913},{},[1914],{"type":25,"value":1915},"edit2.setPlaceholderText('请输入密码')  \n",{"type":19,"tag":120,"props":1917,"children":1918},{"class":122,"line":537},[1919],{"type":19,"tag":120,"props":1920,"children":1921},{},[1922],{"type":25,"value":1923},"from_layout.addRow('密码', edit2)  \n",{"type":19,"tag":120,"props":1925,"children":1926},{"class":122,"line":546},[1927],{"type":19,"tag":120,"props":1928,"children":1929},{},[1930],{"type":25,"value":1931},"v.addLayout(from_layout)  # 将表单布局嵌入垂直布局\n",{"type":19,"tag":120,"props":1933,"children":1934},{"class":122,"line":555},[1935],{"type":19,"tag":120,"props":1936,"children":1937},{},[1938],{"type":25,"value":1939},"v.addWidget(QPushButton('登录'), alignment=Qt.AlignCenter)  \n",{"type":19,"tag":120,"props":1941,"children":1942},{"class":122,"line":564},[1943],{"type":19,"tag":120,"props":1944,"children":1945},{},[1946],{"type":25,"value":1947},"w.setLayout(v) # 将垂直布局与窗口绑定\n",{"type":19,"tag":412,"props":1949,"children":1951},{"id":1950},"抽屉布局qstackedlayout",[1952],{"type":25,"value":1953},"抽屉布局（QStackedLayout）",{"type":19,"tag":32,"props":1955,"children":1956},{},[1957,1962,1963,1969],{"type":19,"tag":116,"props":1958,"children":1960},{"className":1959},[],[1961],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":25,"value":1968},"QStackedLayout()",{"type":25,"value":1970},"方法用来创建一个抽屉布局，示例代码如下：",{"type":19,"tag":109,"props":1972,"children":1974},{"className":284,"code":1973,"language":130,"meta":7,"style":7},"v = QVBoxLayout()  \nstack_layout = QStackedLayout()  \n  \nwin1 = win_1()  \nwin2 = win_2()  \nstack_layout.addWidget(win1)  \nstack_layout.addWidget(win2)  \n  \nbtn1 = QPushButton('抽屉1')  \nbtn2 = QPushButton('抽屉2')  \n# 绑定点击事件 对象.信号.connect(槽函数)  \nbtn1.clicked.connect(btn_press1)  \nbtn2.clicked.connect(btn_press2)  \n  \nv.addLayout(stack_layout)  \nv.addWidget(btn1)  \nv.addWidget(btn2)  \nw.setLayout(v)\n",[1975],{"type":19,"tag":116,"props":1976,"children":1977},{"__ignoreMap":7},[1978,1986,1994,2001,2009,2017,2025,2033,2040,2048,2056,2064,2072,2080,2087,2095,2102,2109],{"type":19,"tag":120,"props":1979,"children":1980},{"class":122,"line":123},[1981],{"type":19,"tag":120,"props":1982,"children":1983},{},[1984],{"type":25,"value":1985},"v = QVBoxLayout()  \n",{"type":19,"tag":120,"props":1987,"children":1988},{"class":122,"line":300},[1989],{"type":19,"tag":120,"props":1990,"children":1991},{},[1992],{"type":25,"value":1993},"stack_layout = QStackedLayout()  \n",{"type":19,"tag":120,"props":1995,"children":1996},{"class":122,"line":309},[1997],{"type":19,"tag":120,"props":1998,"children":1999},{},[2000],{"type":25,"value":561},{"type":19,"tag":120,"props":2002,"children":2003},{"class":122,"line":319},[2004],{"type":19,"tag":120,"props":2005,"children":2006},{},[2007],{"type":25,"value":2008},"win1 = win_1()  \n",{"type":19,"tag":120,"props":2010,"children":2011},{"class":122,"line":328},[2012],{"type":19,"tag":120,"props":2013,"children":2014},{},[2015],{"type":25,"value":2016},"win2 = win_2()  \n",{"type":19,"tag":120,"props":2018,"children":2019},{"class":122,"line":337},[2020],{"type":19,"tag":120,"props":2021,"children":2022},{},[2023],{"type":25,"value":2024},"stack_layout.addWidget(win1)  \n",{"type":19,"tag":120,"props":2026,"children":2027},{"class":122,"line":528},[2028],{"type":19,"tag":120,"props":2029,"children":2030},{},[2031],{"type":25,"value":2032},"stack_layout.addWidget(win2)  \n",{"type":19,"tag":120,"props":2034,"children":2035},{"class":122,"line":537},[2036],{"type":19,"tag":120,"props":2037,"children":2038},{},[2039],{"type":25,"value":561},{"type":19,"tag":120,"props":2041,"children":2042},{"class":122,"line":546},[2043],{"type":19,"tag":120,"props":2044,"children":2045},{},[2046],{"type":25,"value":2047},"btn1 = QPushButton('抽屉1')  \n",{"type":19,"tag":120,"props":2049,"children":2050},{"class":122,"line":555},[2051],{"type":19,"tag":120,"props":2052,"children":2053},{},[2054],{"type":25,"value":2055},"btn2 = QPushButton('抽屉2')  \n",{"type":19,"tag":120,"props":2057,"children":2058},{"class":122,"line":564},[2059],{"type":19,"tag":120,"props":2060,"children":2061},{},[2062],{"type":25,"value":2063},"# 绑定点击事件 对象.信号.connect(槽函数)  \n",{"type":19,"tag":120,"props":2065,"children":2066},{"class":122,"line":573},[2067],{"type":19,"tag":120,"props":2068,"children":2069},{},[2070],{"type":25,"value":2071},"btn1.clicked.connect(btn_press1)  \n",{"type":19,"tag":120,"props":2073,"children":2074},{"class":122,"line":1779},[2075],{"type":19,"tag":120,"props":2076,"children":2077},{},[2078],{"type":25,"value":2079},"btn2.clicked.connect(btn_press2)  \n",{"type":19,"tag":120,"props":2081,"children":2082},{"class":122,"line":1788},[2083],{"type":19,"tag":120,"props":2084,"children":2085},{},[2086],{"type":25,"value":561},{"type":19,"tag":120,"props":2088,"children":2089},{"class":122,"line":1797},[2090],{"type":19,"tag":120,"props":2091,"children":2092},{},[2093],{"type":25,"value":2094},"v.addLayout(stack_layout)  \n",{"type":19,"tag":120,"props":2096,"children":2097},{"class":122,"line":1806},[2098],{"type":19,"tag":120,"props":2099,"children":2100},{},[2101],{"type":25,"value":1248},{"type":19,"tag":120,"props":2103,"children":2104},{"class":122,"line":1815},[2105],{"type":19,"tag":120,"props":2106,"children":2107},{},[2108],{"type":25,"value":1256},{"type":19,"tag":120,"props":2110,"children":2111},{"class":122,"line":1824},[2112],{"type":19,"tag":120,"props":2113,"children":2114},{},[2115],{"type":25,"value":2116},"w.setLayout(v)\n",{"type":19,"tag":32,"props":2118,"children":2119},{},[2120],{"type":25,"value":2121},"调用的函数部分的结果如下所示：",{"type":19,"tag":109,"props":2123,"children":2125},{"className":284,"code":2124,"language":130,"meta":7,"style":7},"def win_1():  \n    '''函数体'''\ndef win_2():  \n    '''函数体'''\ndef btn_press1():  \n    stack_layout.setCurrentIndex(0) # 设置当前索引为0  \ndef btn_press2():  \n    stack_layout.setCurrentIndex(1)\n",[2126],{"type":19,"tag":116,"props":2127,"children":2128},{"__ignoreMap":7},[2129,2137,2145,2153,2160,2168,2176,2184],{"type":19,"tag":120,"props":2130,"children":2131},{"class":122,"line":123},[2132],{"type":19,"tag":120,"props":2133,"children":2134},{},[2135],{"type":25,"value":2136},"def win_1():  \n",{"type":19,"tag":120,"props":2138,"children":2139},{"class":122,"line":300},[2140],{"type":19,"tag":120,"props":2141,"children":2142},{},[2143],{"type":25,"value":2144},"    '''函数体'''\n",{"type":19,"tag":120,"props":2146,"children":2147},{"class":122,"line":309},[2148],{"type":19,"tag":120,"props":2149,"children":2150},{},[2151],{"type":25,"value":2152},"def win_2():  \n",{"type":19,"tag":120,"props":2154,"children":2155},{"class":122,"line":319},[2156],{"type":19,"tag":120,"props":2157,"children":2158},{},[2159],{"type":25,"value":2144},{"type":19,"tag":120,"props":2161,"children":2162},{"class":122,"line":328},[2163],{"type":19,"tag":120,"props":2164,"children":2165},{},[2166],{"type":25,"value":2167},"def btn_press1():  \n",{"type":19,"tag":120,"props":2169,"children":2170},{"class":122,"line":337},[2171],{"type":19,"tag":120,"props":2172,"children":2173},{},[2174],{"type":25,"value":2175},"    stack_layout.setCurrentIndex(0) # 设置当前索引为0  \n",{"type":19,"tag":120,"props":2177,"children":2178},{"class":122,"line":528},[2179],{"type":19,"tag":120,"props":2180,"children":2181},{},[2182],{"type":25,"value":2183},"def btn_press2():  \n",{"type":19,"tag":120,"props":2185,"children":2186},{"class":122,"line":537},[2187],{"type":19,"tag":120,"props":2188,"children":2189},{},[2190],{"type":25,"value":2191},"    stack_layout.setCurrentIndex(1)\n",{"type":19,"tag":32,"props":2193,"children":2194},{},[2195],{"type":25,"value":2196},"在执行这些代码的过程中，它都处于如下框架内：",{"type":19,"tag":109,"props":2198,"children":2200},{"className":284,"code":2199,"language":130,"meta":7,"style":7},"app = QApplication(sys.argv)  \nw = QWidget()\n\n'''设置窗口'''\n\nw.show()  \nsys.exit(app.exec_())\n",[2201],{"type":19,"tag":116,"props":2202,"children":2203},{"__ignoreMap":7},[2204,2212,2220,2227,2235,2242,2250],{"type":19,"tag":120,"props":2205,"children":2206},{"class":122,"line":123},[2207],{"type":19,"tag":120,"props":2208,"children":2209},{},[2210],{"type":25,"value":2211},"app = QApplication(sys.argv)  \n",{"type":19,"tag":120,"props":2213,"children":2214},{"class":122,"line":300},[2215],{"type":19,"tag":120,"props":2216,"children":2217},{},[2218],{"type":25,"value":2219},"w = QWidget()\n",{"type":19,"tag":120,"props":2221,"children":2222},{"class":122,"line":309},[2223],{"type":19,"tag":120,"props":2224,"children":2225},{"emptyLinePlaceholder":313},[2226],{"type":25,"value":316},{"type":19,"tag":120,"props":2228,"children":2229},{"class":122,"line":319},[2230],{"type":19,"tag":120,"props":2231,"children":2232},{},[2233],{"type":25,"value":2234},"'''设置窗口'''\n",{"type":19,"tag":120,"props":2236,"children":2237},{"class":122,"line":328},[2238],{"type":19,"tag":120,"props":2239,"children":2240},{"emptyLinePlaceholder":313},[2241],{"type":25,"value":316},{"type":19,"tag":120,"props":2243,"children":2244},{"class":122,"line":337},[2245],{"type":19,"tag":120,"props":2246,"children":2247},{},[2248],{"type":25,"value":2249},"w.show()  \n",{"type":19,"tag":120,"props":2251,"children":2252},{"class":122,"line":528},[2253],{"type":19,"tag":120,"props":2254,"children":2255},{},[2256],{"type":25,"value":2257},"sys.exit(app.exec_())\n",{"type":19,"tag":32,"props":2259,"children":2260},{},[2261],{"type":25,"value":2262},"在使用这些布局时记得导入，导入方式如下所示：",{"type":19,"tag":109,"props":2264,"children":2266},{"className":284,"code":2265,"language":130,"meta":7,"style":7},"from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QVBoxLayout, QFormLayout, QStackedLayout, QGroupBox, QRadioButton, QHBoxLayout, QLabel\n",[2267],{"type":19,"tag":116,"props":2268,"children":2269},{"__ignoreMap":7},[2270],{"type":19,"tag":120,"props":2271,"children":2272},{"class":122,"line":123},[2273],{"type":19,"tag":120,"props":2274,"children":2275},{},[2276],{"type":25,"value":2265},{"type":19,"tag":20,"props":2278,"children":2280},{"id":2279},"窗口居中",[2281],{"type":25,"value":2279},{"type":19,"tag":28,"props":2283,"children":2284},{},[],{"type":19,"tag":412,"props":2286,"children":2288},{"id":2287},"获取中央位置坐标",[2289],{"type":25,"value":2287},{"type":19,"tag":32,"props":2291,"children":2292},{},[2293,2298,2299,2305,2307,2313,2315,2321,2323,2329],{"type":19,"tag":116,"props":2294,"children":2296},{"className":2295},[],[2297],{"type":25,"value":387},{"type":25,"value":806},{"type":19,"tag":116,"props":2300,"children":2302},{"className":2301},[],[2303],{"type":25,"value":2304},"QDesktopWidget().screenGeometry().center()",{"type":25,"value":2306},"方法用来获取屏幕的中央位置，返回值为一个坐标对象",{"type":19,"tag":116,"props":2308,"children":2310},{"className":2309},[],[2311],{"type":25,"value":2312},"Qpoint",{"type":25,"value":2314},"。可以使用",{"type":19,"tag":116,"props":2316,"children":2318},{"className":2317},[],[2319],{"type":25,"value":2320},"Qpoint对象.x",{"type":25,"value":2322},",",{"type":19,"tag":116,"props":2324,"children":2326},{"className":2325},[],[2327],{"type":25,"value":2328},"Qpoint对象.y",{"type":25,"value":2330},"来获取到该坐标的数值。如下代码所示：",{"type":19,"tag":109,"props":2332,"children":2334},{"className":284,"code":2333,"language":130,"meta":7,"style":7},"# 使用QDesktopWidget方法  \ncenter_pointer = QDesktopWidget().screenGeometry().center()   \nx = center_pointer.x()  \ny = center_pointer.y()  \n",[2335],{"type":19,"tag":116,"props":2336,"children":2337},{"__ignoreMap":7},[2338,2346,2354,2362],{"type":19,"tag":120,"props":2339,"children":2340},{"class":122,"line":123},[2341],{"type":19,"tag":120,"props":2342,"children":2343},{},[2344],{"type":25,"value":2345},"# 使用QDesktopWidget方法  \n",{"type":19,"tag":120,"props":2347,"children":2348},{"class":122,"line":300},[2349],{"type":19,"tag":120,"props":2350,"children":2351},{},[2352],{"type":25,"value":2353},"center_pointer = QDesktopWidget().screenGeometry().center()   \n",{"type":19,"tag":120,"props":2355,"children":2356},{"class":122,"line":309},[2357],{"type":19,"tag":120,"props":2358,"children":2359},{},[2360],{"type":25,"value":2361},"x = center_pointer.x()  \n",{"type":19,"tag":120,"props":2363,"children":2364},{"class":122,"line":319},[2365],{"type":19,"tag":120,"props":2366,"children":2367},{},[2368],{"type":25,"value":2369},"y = center_pointer.y()\n",{"type":19,"tag":412,"props":2371,"children":2373},{"id":2372},"将窗口居中显示",[2374],{"type":25,"value":2372},{"type":19,"tag":32,"props":2376,"children":2377},{},[2378,2380,2386],{"type":25,"value":2379},"当获取到中央位置后可以减去窗口的宽和高，再使用",{"type":19,"tag":116,"props":2381,"children":2383},{"className":2382},[],[2384],{"type":25,"value":2385},"w.move(x-width\u002F\u002F2,y-height\u002F\u002F2)",{"type":25,"value":2387},"打掉将窗口居中显示的效果。例如当窗口w大小为（600，400）",{"type":19,"tag":109,"props":2389,"children":2391},{"className":284,"code":2390,"language":130,"meta":7,"style":7},"w.move(x-600\u002F\u002F2, y-400\u002F\u002F2) # w.resize(600,400)\n",[2392],{"type":19,"tag":116,"props":2393,"children":2394},{"__ignoreMap":7},[2395],{"type":19,"tag":120,"props":2396,"children":2397},{"class":122,"line":123},[2398],{"type":19,"tag":120,"props":2399,"children":2400},{},[2401],{"type":25,"value":2390},{"type":19,"tag":32,"props":2403,"children":2404},{},[2405,2407,2412,2414,2420,2422,2427],{"type":25,"value":2406},"上述的计算中央坐标的方式需要手动输入窗口的大小，为了方便，我们可以使用自动计算居中，其中使用到了",{"type":19,"tag":116,"props":2408,"children":2410},{"className":2409},[],[2411],{"type":25,"value":601},{"type":25,"value":2413},"对象的",{"type":19,"tag":116,"props":2415,"children":2417},{"className":2416},[],[2418],{"type":25,"value":2419},"frameGeometry()",{"type":25,"value":2421},"方法以获得",{"type":19,"tag":116,"props":2423,"children":2425},{"className":2424},[],[2426],{"type":25,"value":601},{"type":25,"value":2428},"对象的窗口大小及位置 ，以元组的形式返回。如下代码所示：",{"type":19,"tag":109,"props":2430,"children":2432},{"className":284,"code":2431,"language":130,"meta":7,"style":7},"\"\"\"自动计算居中\"\"\"  \n# 使用frameGeometry方法获取窗口坐标对象  \nprint(type(w.frameGeometry()),w.frameGeometry())  # 得到的QRect对象  \n# 使用QRect对象的getRect方法得到坐标的元组  \ntup = w.frameGeometry().getRect()  \nprint(type(w.frameGeometry().getRect()),w.frameGeometry().getRect())  \nw.move(x-tup[2]\u002F\u002F2, y-tup[3]\u002F\u002F2)\n",[2433],{"type":19,"tag":116,"props":2434,"children":2435},{"__ignoreMap":7},[2436,2444,2452,2460,2468,2476,2484],{"type":19,"tag":120,"props":2437,"children":2438},{"class":122,"line":123},[2439],{"type":19,"tag":120,"props":2440,"children":2441},{},[2442],{"type":25,"value":2443},"\"\"\"自动计算居中\"\"\"  \n",{"type":19,"tag":120,"props":2445,"children":2446},{"class":122,"line":300},[2447],{"type":19,"tag":120,"props":2448,"children":2449},{},[2450],{"type":25,"value":2451},"# 使用frameGeometry方法获取窗口坐标对象  \n",{"type":19,"tag":120,"props":2453,"children":2454},{"class":122,"line":309},[2455],{"type":19,"tag":120,"props":2456,"children":2457},{},[2458],{"type":25,"value":2459},"print(type(w.frameGeometry()),w.frameGeometry())  # 得到的QRect对象  \n",{"type":19,"tag":120,"props":2461,"children":2462},{"class":122,"line":319},[2463],{"type":19,"tag":120,"props":2464,"children":2465},{},[2466],{"type":25,"value":2467},"# 使用QRect对象的getRect方法得到坐标的元组  \n",{"type":19,"tag":120,"props":2469,"children":2470},{"class":122,"line":328},[2471],{"type":19,"tag":120,"props":2472,"children":2473},{},[2474],{"type":25,"value":2475},"tup = w.frameGeometry().getRect()  \n",{"type":19,"tag":120,"props":2477,"children":2478},{"class":122,"line":337},[2479],{"type":19,"tag":120,"props":2480,"children":2481},{},[2482],{"type":25,"value":2483},"print(type(w.frameGeometry().getRect()),w.frameGeometry().getRect())  \n",{"type":19,"tag":120,"props":2485,"children":2486},{"class":122,"line":528},[2487],{"type":19,"tag":120,"props":2488,"children":2489},{},[2490],{"type":25,"value":2491},"w.move(x-tup[2]\u002F\u002F2, y-tup[3]\u002F\u002F2)\n",{"type":19,"tag":20,"props":2493,"children":2495},{"id":2494},"创建窗口的形式",[2496],{"type":25,"value":2494},{"type":19,"tag":28,"props":2498,"children":2499},{},[],{"type":19,"tag":32,"props":2501,"children":2502},{},[2503],{"type":25,"value":2504},"窗口的创建形式主要分为三种：",{"type":19,"tag":38,"props":2506,"children":2507},{},[2508,2513,2518],{"type":19,"tag":42,"props":2509,"children":2510},{},[2511],{"type":25,"value":2512},"QWidget（基础窗口类）",{"type":19,"tag":42,"props":2514,"children":2515},{},[2516],{"type":25,"value":2517},"QMainWindow（主窗口类）",{"type":19,"tag":42,"props":2519,"children":2520},{},[2521],{"type":25,"value":2522},"QDialog（对话框类）",{"type":19,"tag":412,"props":2524,"children":2526},{"id":2525},"qwidget",[2527],{"type":25,"value":601},{"type":19,"tag":32,"props":2529,"children":2530},{},[2531,2536],{"type":19,"tag":116,"props":2532,"children":2534},{"className":2533},[],[2535],{"type":25,"value":601},{"type":25,"value":2537},"是所有用户界面元素的基类，即控件和窗口的父类，是最基础的窗口组件，可独立作为窗口，也可作为其他组件的容器，自由度高（什么东西都没有），多应用于小型工具窗口、自定义控件的载体。示例代码如下所示：",{"type":19,"tag":109,"props":2539,"children":2541},{"className":284,"code":2540,"language":130,"meta":7,"style":7},"import sys  \nfrom PyQt5.QtWidgets import QApplication,QWidget  \n\nif __name__ == '__main__':  \n    app = QApplication(sys.argv) \n    w = QWidget()\n    \n    ''''此处补充窗口设置代码'''\n     \n    w.show()  \n    app.exec_()\n",[2542],{"type":19,"tag":116,"props":2543,"children":2544},{"__ignoreMap":7},[2545,2553,2561,2568,2575,2583,2591,2599,2607,2615,2622],{"type":19,"tag":120,"props":2546,"children":2547},{"class":122,"line":123},[2548],{"type":19,"tag":120,"props":2549,"children":2550},{},[2551],{"type":25,"value":2552},"import sys  \n",{"type":19,"tag":120,"props":2554,"children":2555},{"class":122,"line":300},[2556],{"type":19,"tag":120,"props":2557,"children":2558},{},[2559],{"type":25,"value":2560},"from PyQt5.QtWidgets import QApplication,QWidget  \n",{"type":19,"tag":120,"props":2562,"children":2563},{"class":122,"line":309},[2564],{"type":19,"tag":120,"props":2565,"children":2566},{"emptyLinePlaceholder":313},[2567],{"type":25,"value":316},{"type":19,"tag":120,"props":2569,"children":2570},{"class":122,"line":319},[2571],{"type":19,"tag":120,"props":2572,"children":2573},{},[2574],{"type":25,"value":485},{"type":19,"tag":120,"props":2576,"children":2577},{"class":122,"line":328},[2578],{"type":19,"tag":120,"props":2579,"children":2580},{},[2581],{"type":25,"value":2582},"    app = QApplication(sys.argv) \n",{"type":19,"tag":120,"props":2584,"children":2585},{"class":122,"line":337},[2586],{"type":19,"tag":120,"props":2587,"children":2588},{},[2589],{"type":25,"value":2590},"    w = QWidget()\n",{"type":19,"tag":120,"props":2592,"children":2593},{"class":122,"line":528},[2594],{"type":19,"tag":120,"props":2595,"children":2596},{},[2597],{"type":25,"value":2598},"    \n",{"type":19,"tag":120,"props":2600,"children":2601},{"class":122,"line":537},[2602],{"type":19,"tag":120,"props":2603,"children":2604},{},[2605],{"type":25,"value":2606},"    ''''此处补充窗口设置代码'''\n",{"type":19,"tag":120,"props":2608,"children":2609},{"class":122,"line":546},[2610],{"type":19,"tag":120,"props":2611,"children":2612},{},[2613],{"type":25,"value":2614},"     \n",{"type":19,"tag":120,"props":2616,"children":2617},{"class":122,"line":555},[2618],{"type":19,"tag":120,"props":2619,"children":2620},{},[2621],{"type":25,"value":552},{"type":19,"tag":120,"props":2623,"children":2624},{"class":122,"line":564},[2625],{"type":19,"tag":120,"props":2626,"children":2627},{},[2628],{"type":25,"value":2629},"    app.exec_()\n",{"type":19,"tag":412,"props":2631,"children":2633},{"id":2632},"qmainwindow",[2634],{"type":25,"value":2635},"QMainWindow",{"type":19,"tag":32,"props":2637,"children":2638},{},[2639,2644,2646,2651,2653,2658],{"type":19,"tag":116,"props":2640,"children":2642},{"className":2641},[],[2643],{"type":25,"value":2635},{"type":25,"value":2645},"专门用于创建应用程序的主窗口，继承自",{"type":19,"tag":116,"props":2647,"children":2649},{"className":2648},[],[2650],{"type":25,"value":601},{"type":25,"value":2652},"，是QWidget的子类，自带标准布局，包含菜单栏、工具栏、状态栏、标题栏等，中间部分为主窗口区域。多应用于文本编辑器、浏览器等拥有完整菜单和工具条的应用程序主界面。",{"type":19,"tag":116,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":25,"value":2635},{"type":25,"value":2659},"提供了一些方法如下：",{"type":19,"tag":38,"props":2661,"children":2662},{},[2663,2674,2685,2696],{"type":19,"tag":42,"props":2664,"children":2665},{},[2666,2672],{"type":19,"tag":116,"props":2667,"children":2669},{"className":2668},[],[2670],{"type":25,"value":2671},"menuBar",{"type":25,"value":2673},"：菜单栏",{"type":19,"tag":42,"props":2675,"children":2676},{},[2677,2683],{"type":19,"tag":116,"props":2678,"children":2680},{"className":2679},[],[2681],{"type":25,"value":2682},"toolBar",{"type":25,"value":2684},"：工具栏",{"type":19,"tag":42,"props":2686,"children":2687},{},[2688,2694],{"type":19,"tag":116,"props":2689,"children":2691},{"className":2690},[],[2692],{"type":25,"value":2693},"statusBar",{"type":25,"value":2695},"：状态栏",{"type":19,"tag":42,"props":2697,"children":2698},{},[2699,2705],{"type":19,"tag":116,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":25,"value":2704},"centralWidget",{"type":25,"value":2706},"：中心部件",{"type":19,"tag":32,"props":2708,"children":2709},{},[2710,2712,2717,2719,2724],{"type":25,"value":2711},"以",{"type":19,"tag":116,"props":2713,"children":2715},{"className":2714},[],[2716],{"type":25,"value":2671},{"type":25,"value":2718},"为例，当使用",{"type":19,"tag":116,"props":2720,"children":2722},{"className":2721},[],[2723],{"type":25,"value":2671},{"type":25,"value":2725},"创建一个对象后，该对象将可以使用它包含的几个方法：",{"type":19,"tag":38,"props":2727,"children":2728},{},[2729,2747,2758],{"type":19,"tag":42,"props":2730,"children":2731},{},[2732,2738,2740,2745],{"type":19,"tag":116,"props":2733,"children":2735},{"className":2734},[],[2736],{"type":25,"value":2737},"addMenu(str)",{"type":25,"value":2739},"：向",{"type":19,"tag":116,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":25,"value":2671},{"type":25,"value":2746},"中添加选项",{"type":19,"tag":42,"props":2748,"children":2749},{},[2750,2756],{"type":19,"tag":116,"props":2751,"children":2753},{"className":2752},[],[2754],{"type":25,"value":2755},"addAction(str)",{"type":25,"value":2757},"：向各个选项中添加动作",{"type":19,"tag":42,"props":2759,"children":2760},{},[2761,2767],{"type":19,"tag":116,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":25,"value":2766},"setNativeMenuBar(False)",{"type":25,"value":2768},"：使mac系统菜单栏失效，让其按照Windows菜单栏样式显示",{"type":19,"tag":32,"props":2770,"children":2771},{},[2772],{"type":25,"value":2773},"示例代码如下所示：",{"type":19,"tag":109,"props":2775,"children":2777},{"className":284,"code":2776,"language":130,"meta":7,"style":7},"import sys  \nfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel  \n  \nif __name__ == '__main__':  \n    app = QApplication(sys.argv)  \n    w = QMainWindow()  \n    \n    # 创建菜单栏\n    menu = w.menuBar()   \n    menu.setNativeMenuBar(False) \n    file_menu = menu.addMenu(\"文件\")  \n    file_menu.addAction(\"新建\")  \n    file_menu.addAction(\"打开\")   \n    user_menu = menu.addMenu(\"用户\")  \n    user_menu.addAction(\"登录\")  \n    user_menu.addAction(\"注册\")  \n    w.setMenuBar(menu)  \n    # 设置主窗口区域  \n    label = QLabel(\"这是主区域\",w)  \n    w.setCentralWidget( label) \n      \n    w.show()  \n    sys.exit(app.exec_())\n",[2778],{"type":19,"tag":116,"props":2779,"children":2780},{"__ignoreMap":7},[2781,2788,2796,2803,2810,2818,2826,2833,2841,2849,2857,2865,2873,2881,2889,2897,2905,2913,2921,2930,2939,2948,2956],{"type":19,"tag":120,"props":2782,"children":2783},{"class":122,"line":123},[2784],{"type":19,"tag":120,"props":2785,"children":2786},{},[2787],{"type":25,"value":2552},{"type":19,"tag":120,"props":2789,"children":2790},{"class":122,"line":300},[2791],{"type":19,"tag":120,"props":2792,"children":2793},{},[2794],{"type":25,"value":2795},"from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel  \n",{"type":19,"tag":120,"props":2797,"children":2798},{"class":122,"line":309},[2799],{"type":19,"tag":120,"props":2800,"children":2801},{},[2802],{"type":25,"value":561},{"type":19,"tag":120,"props":2804,"children":2805},{"class":122,"line":319},[2806],{"type":19,"tag":120,"props":2807,"children":2808},{},[2809],{"type":25,"value":485},{"type":19,"tag":120,"props":2811,"children":2812},{"class":122,"line":328},[2813],{"type":19,"tag":120,"props":2814,"children":2815},{},[2816],{"type":25,"value":2817},"    app = QApplication(sys.argv)  \n",{"type":19,"tag":120,"props":2819,"children":2820},{"class":122,"line":337},[2821],{"type":19,"tag":120,"props":2822,"children":2823},{},[2824],{"type":25,"value":2825},"    w = QMainWindow()  \n",{"type":19,"tag":120,"props":2827,"children":2828},{"class":122,"line":528},[2829],{"type":19,"tag":120,"props":2830,"children":2831},{},[2832],{"type":25,"value":2598},{"type":19,"tag":120,"props":2834,"children":2835},{"class":122,"line":537},[2836],{"type":19,"tag":120,"props":2837,"children":2838},{},[2839],{"type":25,"value":2840},"    # 创建菜单栏\n",{"type":19,"tag":120,"props":2842,"children":2843},{"class":122,"line":546},[2844],{"type":19,"tag":120,"props":2845,"children":2846},{},[2847],{"type":25,"value":2848},"    menu = w.menuBar()   \n",{"type":19,"tag":120,"props":2850,"children":2851},{"class":122,"line":555},[2852],{"type":19,"tag":120,"props":2853,"children":2854},{},[2855],{"type":25,"value":2856},"    menu.setNativeMenuBar(False) \n",{"type":19,"tag":120,"props":2858,"children":2859},{"class":122,"line":564},[2860],{"type":19,"tag":120,"props":2861,"children":2862},{},[2863],{"type":25,"value":2864},"    file_menu = menu.addMenu(\"文件\")  \n",{"type":19,"tag":120,"props":2866,"children":2867},{"class":122,"line":573},[2868],{"type":19,"tag":120,"props":2869,"children":2870},{},[2871],{"type":25,"value":2872},"    file_menu.addAction(\"新建\")  \n",{"type":19,"tag":120,"props":2874,"children":2875},{"class":122,"line":1779},[2876],{"type":19,"tag":120,"props":2877,"children":2878},{},[2879],{"type":25,"value":2880},"    file_menu.addAction(\"打开\")   \n",{"type":19,"tag":120,"props":2882,"children":2883},{"class":122,"line":1788},[2884],{"type":19,"tag":120,"props":2885,"children":2886},{},[2887],{"type":25,"value":2888},"    user_menu = menu.addMenu(\"用户\")  \n",{"type":19,"tag":120,"props":2890,"children":2891},{"class":122,"line":1797},[2892],{"type":19,"tag":120,"props":2893,"children":2894},{},[2895],{"type":25,"value":2896},"    user_menu.addAction(\"登录\")  \n",{"type":19,"tag":120,"props":2898,"children":2899},{"class":122,"line":1806},[2900],{"type":19,"tag":120,"props":2901,"children":2902},{},[2903],{"type":25,"value":2904},"    user_menu.addAction(\"注册\")  \n",{"type":19,"tag":120,"props":2906,"children":2907},{"class":122,"line":1815},[2908],{"type":19,"tag":120,"props":2909,"children":2910},{},[2911],{"type":25,"value":2912},"    w.setMenuBar(menu)  \n",{"type":19,"tag":120,"props":2914,"children":2915},{"class":122,"line":1824},[2916],{"type":19,"tag":120,"props":2917,"children":2918},{},[2919],{"type":25,"value":2920},"    # 设置主窗口区域  \n",{"type":19,"tag":120,"props":2922,"children":2924},{"class":122,"line":2923},19,[2925],{"type":19,"tag":120,"props":2926,"children":2927},{},[2928],{"type":25,"value":2929},"    label = QLabel(\"这是主区域\",w)  \n",{"type":19,"tag":120,"props":2931,"children":2933},{"class":122,"line":2932},20,[2934],{"type":19,"tag":120,"props":2935,"children":2936},{},[2937],{"type":25,"value":2938},"    w.setCentralWidget( label) \n",{"type":19,"tag":120,"props":2940,"children":2942},{"class":122,"line":2941},21,[2943],{"type":19,"tag":120,"props":2944,"children":2945},{},[2946],{"type":25,"value":2947},"      \n",{"type":19,"tag":120,"props":2949,"children":2951},{"class":122,"line":2950},22,[2952],{"type":19,"tag":120,"props":2953,"children":2954},{},[2955],{"type":25,"value":552},{"type":19,"tag":120,"props":2957,"children":2959},{"class":122,"line":2958},23,[2960],{"type":19,"tag":120,"props":2961,"children":2962},{},[2963],{"type":25,"value":2964},"    sys.exit(app.exec_())\n",{"type":19,"tag":412,"props":2966,"children":2968},{"id":2967},"qdialog",[2969],{"type":25,"value":2970},"QDialog",{"type":19,"tag":32,"props":2972,"children":2973},{},[2974,2979,2981,2986,2988,2993],{"type":19,"tag":116,"props":2975,"children":2977},{"className":2976},[],[2978],{"type":25,"value":2970},{"type":25,"value":2980},"用于创建对话框窗口，继承自",{"type":19,"tag":116,"props":2982,"children":2984},{"className":2983},[],[2985],{"type":25,"value":601},{"type":25,"value":2987},"，主要用于与用户进行短期交互（如提示、设置、确认等），多应用于打开文件对话框、设置对话框、确认删除等提示框。",{"type":19,"tag":116,"props":2989,"children":2991},{"className":2990},[],[2992],{"type":25,"value":2970},{"type":25,"value":2994},"主要有两种特点：",{"type":19,"tag":38,"props":2996,"children":2997},{},[2998,3011],{"type":19,"tag":42,"props":2999,"children":3000},{},[3001,3003,3009],{"type":25,"value":3002},"模态（阻塞父窗口操作），通过",{"type":19,"tag":116,"props":3004,"children":3006},{"className":3005},[],[3007],{"type":25,"value":3008},"exec()",{"type":25,"value":3010},"方法显示模态对话框",{"type":19,"tag":42,"props":3012,"children":3013},{},[3014,3016,3022],{"type":25,"value":3015},"非模态（不阻塞父窗口操作），通过",{"type":19,"tag":116,"props":3017,"children":3019},{"className":3018},[],[3020],{"type":25,"value":3021},"show()",{"type":25,"value":3023},"显示非模态对话框",{"type":19,"tag":707,"props":3025,"children":3026},{},[3027,3057],{"type":19,"tag":711,"props":3028,"children":3029},{},[3030],{"type":19,"tag":715,"props":3031,"children":3032},{},[3033,3041,3049],{"type":19,"tag":719,"props":3034,"children":3035},{},[3036],{"type":19,"tag":46,"props":3037,"children":3038},{},[3039],{"type":25,"value":3040},"特性",{"type":19,"tag":719,"props":3042,"children":3043},{},[3044],{"type":19,"tag":46,"props":3045,"children":3046},{},[3047],{"type":25,"value":3048},"模态对话框 (Modal)",{"type":19,"tag":719,"props":3050,"children":3051},{},[3052],{"type":19,"tag":46,"props":3053,"children":3054},{},[3055],{"type":25,"value":3056},"非模态对话框 (Modeless)",{"type":19,"tag":734,"props":3058,"children":3059},{},[3060,3081,3116],{"type":19,"tag":715,"props":3061,"children":3062},{},[3063,3071,3076],{"type":19,"tag":741,"props":3064,"children":3065},{},[3066],{"type":19,"tag":46,"props":3067,"children":3068},{},[3069],{"type":25,"value":3070},"阻塞行为",{"type":19,"tag":741,"props":3072,"children":3073},{},[3074],{"type":25,"value":3075},"阻塞父窗口，必须关闭后才能操作其他窗口",{"type":19,"tag":741,"props":3077,"children":3078},{},[3079],{"type":25,"value":3080},"不阻塞父窗口，可同时操作多个窗口",{"type":19,"tag":715,"props":3082,"children":3083},{},[3084,3092,3108],{"type":19,"tag":741,"props":3085,"children":3086},{},[3087],{"type":19,"tag":46,"props":3088,"children":3089},{},[3090],{"type":25,"value":3091},"创建方法",{"type":19,"tag":741,"props":3093,"children":3094},{},[3095,3100,3102],{"type":19,"tag":116,"props":3096,"children":3098},{"className":3097},[],[3099],{"type":25,"value":3008},{"type":25,"value":3101}," 或 ",{"type":19,"tag":116,"props":3103,"children":3105},{"className":3104},[],[3106],{"type":25,"value":3107},"setModal(True)+show()",{"type":19,"tag":741,"props":3109,"children":3110},{},[3111],{"type":19,"tag":116,"props":3112,"children":3114},{"className":3113},[],[3115],{"type":25,"value":3021},{"type":19,"tag":715,"props":3117,"children":3118},{},[3119,3127,3132],{"type":19,"tag":741,"props":3120,"children":3121},{},[3122],{"type":19,"tag":46,"props":3123,"children":3124},{},[3125],{"type":25,"value":3126},"使用场景",{"type":19,"tag":741,"props":3128,"children":3129},{},[3130],{"type":25,"value":3131},"必须立即处理的交互（如确认删除）",{"type":19,"tag":741,"props":3133,"children":3134},{},[3135],{"type":25,"value":3136},"辅助工具（如浮动搜索框）",{"type":19,"tag":32,"props":3138,"children":3139},{},[3140],{"type":25,"value":3141},"模态对话框 (阻塞式)，打开对话框后，无法点击主窗口的任何部分。示例代码如下：",{"type":19,"tag":109,"props":3143,"children":3145},{"className":284,"code":3144,"language":130,"meta":7,"style":7},"import sys\nfrom PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QVBoxLayout, QLabel\n\nclass ModalDialog(QDialog):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle(\"模态对话框\")\n        layout = QVBoxLayout()\n        layout.addWidget(QLabel(\"我是模态对话框！关闭我才能操作主窗口\"))\n        self.setLayout(layout)\n\nclass MainWindow(QMainWindow):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle(\"主窗口\")\n        self.setGeometry(300, 300, 300, 200)\n        \n        btn = QPushButton(\"打开模态对话框\", self)\n        btn.clicked.connect(self.open_modal)\n        self.setCentralWidget(btn)\n\n    def open_modal(self):\n        dialog = ModalDialog()\n        dialog.exec()  # 关键：使用exec()阻塞主窗口\n\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n    window = MainWindow()\n    window.show()\n    sys.exit(app.exec_())\n",[3146],{"type":19,"tag":116,"props":3147,"children":3148},{"__ignoreMap":7},[3149,3156,3164,3171,3179,3187,3195,3203,3211,3219,3227,3234,3242,3249,3256,3264,3272,3280,3288,3296,3304,3311,3319,3327,3336,3344,3353,3362,3371,3380],{"type":19,"tag":120,"props":3150,"children":3151},{"class":122,"line":123},[3152],{"type":19,"tag":120,"props":3153,"children":3154},{},[3155],{"type":25,"value":457},{"type":19,"tag":120,"props":3157,"children":3158},{"class":122,"line":300},[3159],{"type":19,"tag":120,"props":3160,"children":3161},{},[3162],{"type":25,"value":3163},"from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QVBoxLayout, QLabel\n",{"type":19,"tag":120,"props":3165,"children":3166},{"class":122,"line":309},[3167],{"type":19,"tag":120,"props":3168,"children":3169},{"emptyLinePlaceholder":313},[3170],{"type":25,"value":316},{"type":19,"tag":120,"props":3172,"children":3173},{"class":122,"line":319},[3174],{"type":19,"tag":120,"props":3175,"children":3176},{},[3177],{"type":25,"value":3178},"class ModalDialog(QDialog):\n",{"type":19,"tag":120,"props":3180,"children":3181},{"class":122,"line":328},[3182],{"type":19,"tag":120,"props":3183,"children":3184},{},[3185],{"type":25,"value":3186},"    def __init__(self):\n",{"type":19,"tag":120,"props":3188,"children":3189},{"class":122,"line":337},[3190],{"type":19,"tag":120,"props":3191,"children":3192},{},[3193],{"type":25,"value":3194},"        super().__init__()\n",{"type":19,"tag":120,"props":3196,"children":3197},{"class":122,"line":528},[3198],{"type":19,"tag":120,"props":3199,"children":3200},{},[3201],{"type":25,"value":3202},"        self.setWindowTitle(\"模态对话框\")\n",{"type":19,"tag":120,"props":3204,"children":3205},{"class":122,"line":537},[3206],{"type":19,"tag":120,"props":3207,"children":3208},{},[3209],{"type":25,"value":3210},"        layout = QVBoxLayout()\n",{"type":19,"tag":120,"props":3212,"children":3213},{"class":122,"line":546},[3214],{"type":19,"tag":120,"props":3215,"children":3216},{},[3217],{"type":25,"value":3218},"        layout.addWidget(QLabel(\"我是模态对话框！关闭我才能操作主窗口\"))\n",{"type":19,"tag":120,"props":3220,"children":3221},{"class":122,"line":555},[3222],{"type":19,"tag":120,"props":3223,"children":3224},{},[3225],{"type":25,"value":3226},"        self.setLayout(layout)\n",{"type":19,"tag":120,"props":3228,"children":3229},{"class":122,"line":564},[3230],{"type":19,"tag":120,"props":3231,"children":3232},{"emptyLinePlaceholder":313},[3233],{"type":25,"value":316},{"type":19,"tag":120,"props":3235,"children":3236},{"class":122,"line":573},[3237],{"type":19,"tag":120,"props":3238,"children":3239},{},[3240],{"type":25,"value":3241},"class MainWindow(QMainWindow):\n",{"type":19,"tag":120,"props":3243,"children":3244},{"class":122,"line":1779},[3245],{"type":19,"tag":120,"props":3246,"children":3247},{},[3248],{"type":25,"value":3186},{"type":19,"tag":120,"props":3250,"children":3251},{"class":122,"line":1788},[3252],{"type":19,"tag":120,"props":3253,"children":3254},{},[3255],{"type":25,"value":3194},{"type":19,"tag":120,"props":3257,"children":3258},{"class":122,"line":1797},[3259],{"type":19,"tag":120,"props":3260,"children":3261},{},[3262],{"type":25,"value":3263},"        self.setWindowTitle(\"主窗口\")\n",{"type":19,"tag":120,"props":3265,"children":3266},{"class":122,"line":1806},[3267],{"type":19,"tag":120,"props":3268,"children":3269},{},[3270],{"type":25,"value":3271},"        self.setGeometry(300, 300, 300, 200)\n",{"type":19,"tag":120,"props":3273,"children":3274},{"class":122,"line":1815},[3275],{"type":19,"tag":120,"props":3276,"children":3277},{},[3278],{"type":25,"value":3279},"        \n",{"type":19,"tag":120,"props":3281,"children":3282},{"class":122,"line":1824},[3283],{"type":19,"tag":120,"props":3284,"children":3285},{},[3286],{"type":25,"value":3287},"        btn = QPushButton(\"打开模态对话框\", self)\n",{"type":19,"tag":120,"props":3289,"children":3290},{"class":122,"line":2923},[3291],{"type":19,"tag":120,"props":3292,"children":3293},{},[3294],{"type":25,"value":3295},"        btn.clicked.connect(self.open_modal)\n",{"type":19,"tag":120,"props":3297,"children":3298},{"class":122,"line":2932},[3299],{"type":19,"tag":120,"props":3300,"children":3301},{},[3302],{"type":25,"value":3303},"        self.setCentralWidget(btn)\n",{"type":19,"tag":120,"props":3305,"children":3306},{"class":122,"line":2941},[3307],{"type":19,"tag":120,"props":3308,"children":3309},{"emptyLinePlaceholder":313},[3310],{"type":25,"value":316},{"type":19,"tag":120,"props":3312,"children":3313},{"class":122,"line":2950},[3314],{"type":19,"tag":120,"props":3315,"children":3316},{},[3317],{"type":25,"value":3318},"    def open_modal(self):\n",{"type":19,"tag":120,"props":3320,"children":3321},{"class":122,"line":2958},[3322],{"type":19,"tag":120,"props":3323,"children":3324},{},[3325],{"type":25,"value":3326},"        dialog = ModalDialog()\n",{"type":19,"tag":120,"props":3328,"children":3330},{"class":122,"line":3329},24,[3331],{"type":19,"tag":120,"props":3332,"children":3333},{},[3334],{"type":25,"value":3335},"        dialog.exec()  # 关键：使用exec()阻塞主窗口\n",{"type":19,"tag":120,"props":3337,"children":3339},{"class":122,"line":3338},25,[3340],{"type":19,"tag":120,"props":3341,"children":3342},{"emptyLinePlaceholder":313},[3343],{"type":25,"value":316},{"type":19,"tag":120,"props":3345,"children":3347},{"class":122,"line":3346},26,[3348],{"type":19,"tag":120,"props":3349,"children":3350},{},[3351],{"type":25,"value":3352},"if __name__ == \"__main__\":\n",{"type":19,"tag":120,"props":3354,"children":3356},{"class":122,"line":3355},27,[3357],{"type":19,"tag":120,"props":3358,"children":3359},{},[3360],{"type":25,"value":3361},"    app = QApplication(sys.argv)\n",{"type":19,"tag":120,"props":3363,"children":3365},{"class":122,"line":3364},28,[3366],{"type":19,"tag":120,"props":3367,"children":3368},{},[3369],{"type":25,"value":3370},"    window = MainWindow()\n",{"type":19,"tag":120,"props":3372,"children":3374},{"class":122,"line":3373},29,[3375],{"type":19,"tag":120,"props":3376,"children":3377},{},[3378],{"type":25,"value":3379},"    window.show()\n",{"type":19,"tag":120,"props":3381,"children":3383},{"class":122,"line":3382},30,[3384],{"type":19,"tag":120,"props":3385,"children":3386},{},[3387],{"type":25,"value":2964},{"type":19,"tag":32,"props":3389,"children":3390},{},[3391],{"type":25,"value":3392},"非模态对话框 (非阻塞式)，对话框和主窗口可同时操作，互不影响。示例代码如下：",{"type":19,"tag":109,"props":3394,"children":3396},{"className":284,"code":3395,"language":130,"meta":7,"style":7},"import sys\nfrom PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QVBoxLayout, QLabel\n\nclass ModelessDialog(QDialog):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle(\"非模态对话框\")\n        layout = QVBoxLayout()\n        layout.addWidget(QLabel(\"我是非模态对话框！可同时操作主窗口\"))\n        self.setLayout(layout)\n\nclass MainWindow(QMainWindow):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle(\"主窗口\")\n        self.setGeometry(300, 300, 300, 200)\n        \n        btn = QPushButton(\"打开非模态对话框\", self)\n        btn.clicked.connect(self.open_modeless)\n        self.setCentralWidget(btn)\n        self.dialog = None  # 防止对话框被垃圾回收\n\n    def open_modeless(self):\n        if not self.dialog:\n            self.dialog = ModelessDialog()\n        self.dialog.show()  # 关键：使用show()不阻塞\n\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n    window = MainWindow()\n    window.show()\n    sys.exit(app.exec_())\n",[3397],{"type":19,"tag":116,"props":3398,"children":3399},{"__ignoreMap":7},[3400,3407,3414,3421,3429,3436,3443,3451,3458,3466,3473,3480,3487,3494,3501,3508,3515,3522,3530,3538,3545,3553,3560,3568,3576,3584,3592,3599,3606,3613,3620,3628],{"type":19,"tag":120,"props":3401,"children":3402},{"class":122,"line":123},[3403],{"type":19,"tag":120,"props":3404,"children":3405},{},[3406],{"type":25,"value":457},{"type":19,"tag":120,"props":3408,"children":3409},{"class":122,"line":300},[3410],{"type":19,"tag":120,"props":3411,"children":3412},{},[3413],{"type":25,"value":3163},{"type":19,"tag":120,"props":3415,"children":3416},{"class":122,"line":309},[3417],{"type":19,"tag":120,"props":3418,"children":3419},{"emptyLinePlaceholder":313},[3420],{"type":25,"value":316},{"type":19,"tag":120,"props":3422,"children":3423},{"class":122,"line":319},[3424],{"type":19,"tag":120,"props":3425,"children":3426},{},[3427],{"type":25,"value":3428},"class ModelessDialog(QDialog):\n",{"type":19,"tag":120,"props":3430,"children":3431},{"class":122,"line":328},[3432],{"type":19,"tag":120,"props":3433,"children":3434},{},[3435],{"type":25,"value":3186},{"type":19,"tag":120,"props":3437,"children":3438},{"class":122,"line":337},[3439],{"type":19,"tag":120,"props":3440,"children":3441},{},[3442],{"type":25,"value":3194},{"type":19,"tag":120,"props":3444,"children":3445},{"class":122,"line":528},[3446],{"type":19,"tag":120,"props":3447,"children":3448},{},[3449],{"type":25,"value":3450},"        self.setWindowTitle(\"非模态对话框\")\n",{"type":19,"tag":120,"props":3452,"children":3453},{"class":122,"line":537},[3454],{"type":19,"tag":120,"props":3455,"children":3456},{},[3457],{"type":25,"value":3210},{"type":19,"tag":120,"props":3459,"children":3460},{"class":122,"line":546},[3461],{"type":19,"tag":120,"props":3462,"children":3463},{},[3464],{"type":25,"value":3465},"        layout.addWidget(QLabel(\"我是非模态对话框！可同时操作主窗口\"))\n",{"type":19,"tag":120,"props":3467,"children":3468},{"class":122,"line":555},[3469],{"type":19,"tag":120,"props":3470,"children":3471},{},[3472],{"type":25,"value":3226},{"type":19,"tag":120,"props":3474,"children":3475},{"class":122,"line":564},[3476],{"type":19,"tag":120,"props":3477,"children":3478},{"emptyLinePlaceholder":313},[3479],{"type":25,"value":316},{"type":19,"tag":120,"props":3481,"children":3482},{"class":122,"line":573},[3483],{"type":19,"tag":120,"props":3484,"children":3485},{},[3486],{"type":25,"value":3241},{"type":19,"tag":120,"props":3488,"children":3489},{"class":122,"line":1779},[3490],{"type":19,"tag":120,"props":3491,"children":3492},{},[3493],{"type":25,"value":3186},{"type":19,"tag":120,"props":3495,"children":3496},{"class":122,"line":1788},[3497],{"type":19,"tag":120,"props":3498,"children":3499},{},[3500],{"type":25,"value":3194},{"type":19,"tag":120,"props":3502,"children":3503},{"class":122,"line":1797},[3504],{"type":19,"tag":120,"props":3505,"children":3506},{},[3507],{"type":25,"value":3263},{"type":19,"tag":120,"props":3509,"children":3510},{"class":122,"line":1806},[3511],{"type":19,"tag":120,"props":3512,"children":3513},{},[3514],{"type":25,"value":3271},{"type":19,"tag":120,"props":3516,"children":3517},{"class":122,"line":1815},[3518],{"type":19,"tag":120,"props":3519,"children":3520},{},[3521],{"type":25,"value":3279},{"type":19,"tag":120,"props":3523,"children":3524},{"class":122,"line":1824},[3525],{"type":19,"tag":120,"props":3526,"children":3527},{},[3528],{"type":25,"value":3529},"        btn = QPushButton(\"打开非模态对话框\", self)\n",{"type":19,"tag":120,"props":3531,"children":3532},{"class":122,"line":2923},[3533],{"type":19,"tag":120,"props":3534,"children":3535},{},[3536],{"type":25,"value":3537},"        btn.clicked.connect(self.open_modeless)\n",{"type":19,"tag":120,"props":3539,"children":3540},{"class":122,"line":2932},[3541],{"type":19,"tag":120,"props":3542,"children":3543},{},[3544],{"type":25,"value":3303},{"type":19,"tag":120,"props":3546,"children":3547},{"class":122,"line":2941},[3548],{"type":19,"tag":120,"props":3549,"children":3550},{},[3551],{"type":25,"value":3552},"        self.dialog = None  # 防止对话框被垃圾回收\n",{"type":19,"tag":120,"props":3554,"children":3555},{"class":122,"line":2950},[3556],{"type":19,"tag":120,"props":3557,"children":3558},{"emptyLinePlaceholder":313},[3559],{"type":25,"value":316},{"type":19,"tag":120,"props":3561,"children":3562},{"class":122,"line":2958},[3563],{"type":19,"tag":120,"props":3564,"children":3565},{},[3566],{"type":25,"value":3567},"    def open_modeless(self):\n",{"type":19,"tag":120,"props":3569,"children":3570},{"class":122,"line":3329},[3571],{"type":19,"tag":120,"props":3572,"children":3573},{},[3574],{"type":25,"value":3575},"        if not self.dialog:\n",{"type":19,"tag":120,"props":3577,"children":3578},{"class":122,"line":3338},[3579],{"type":19,"tag":120,"props":3580,"children":3581},{},[3582],{"type":25,"value":3583},"            self.dialog = ModelessDialog()\n",{"type":19,"tag":120,"props":3585,"children":3586},{"class":122,"line":3346},[3587],{"type":19,"tag":120,"props":3588,"children":3589},{},[3590],{"type":25,"value":3591},"        self.dialog.show()  # 关键：使用show()不阻塞\n",{"type":19,"tag":120,"props":3593,"children":3594},{"class":122,"line":3355},[3595],{"type":19,"tag":120,"props":3596,"children":3597},{"emptyLinePlaceholder":313},[3598],{"type":25,"value":316},{"type":19,"tag":120,"props":3600,"children":3601},{"class":122,"line":3364},[3602],{"type":19,"tag":120,"props":3603,"children":3604},{},[3605],{"type":25,"value":3352},{"type":19,"tag":120,"props":3607,"children":3608},{"class":122,"line":3373},[3609],{"type":19,"tag":120,"props":3610,"children":3611},{},[3612],{"type":25,"value":3361},{"type":19,"tag":120,"props":3614,"children":3615},{"class":122,"line":3382},[3616],{"type":19,"tag":120,"props":3617,"children":3618},{},[3619],{"type":25,"value":3370},{"type":19,"tag":120,"props":3621,"children":3623},{"class":122,"line":3622},31,[3624],{"type":19,"tag":120,"props":3625,"children":3626},{},[3627],{"type":25,"value":3379},{"type":19,"tag":120,"props":3629,"children":3631},{"class":122,"line":3630},32,[3632],{"type":19,"tag":120,"props":3633,"children":3634},{},[3635],{"type":25,"value":2964},{"type":19,"tag":956,"props":3637,"children":3638},{},[3639],{"type":19,"tag":32,"props":3640,"children":3641},{},[3642,3647,3649,3655,3657,3662],{"type":19,"tag":46,"props":3643,"children":3644},{},[3645],{"type":25,"value":3646},"提示",{"type":25,"value":3648},"：非模态对话框需保存引用（如",{"type":19,"tag":116,"props":3650,"children":3652},{"className":3651},[],[3653],{"type":25,"value":3654},"self.dialog",{"type":25,"value":3656},"），否则可能被Python垃圾回收机制销毁。模态对话框因",{"type":19,"tag":116,"props":3658,"children":3660},{"className":3659},[],[3661],{"type":25,"value":3008},{"type":25,"value":3663},"会保持对象存活。",{"type":19,"tag":3665,"props":3666,"children":3667},"style",{},[3668],{"type":25,"value":3669},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":300,"depth":300,"links":3671},[3672,3673,3674,3675,3676,3677,3678],{"id":22,"depth":309,"text":26},{"id":88,"depth":309,"text":91},{"id":346,"depth":309,"text":346},{"id":404,"depth":309,"text":407},{"id":1283,"depth":309,"text":1283},{"id":2279,"depth":309,"text":2279},{"id":2494,"depth":309,"text":2494},"markdown","content:blog:2025-07-15-pyqt5-PyQt5快速入门.md","content","blog\u002F2025-07-15-pyqt5-PyQt5快速入门.md","blog\u002F2025-07-15-pyqt5-PyQt5快速入门","md",1780801018301]