ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

qpushbutton相关

qpushbutton相关 importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QPushButtonif__name____main__:# 创建应用对象appQApplication(sys.argv)# 创建主窗口windowQWidget()window.setWindowTitle(QPushButton 示例)window.resize(400,300)# 创建一个按钮# 第一个参数是按钮上显示的文字第二个参数是它的父组件 设置父对象 不是类的继承关系而是组件的包含关系buttonQPushButton(点我,window)# 设置按钮在窗口中的位置和尺寸 (x, y, 宽, 高)button.move(150,130)button.resize(100,40)# 显示窗口窗口显示后其子组件也会一并显示window.show()# 进入应用主循环sys.exit(app.exec_())QPushButton(点我, window)第二个参数就是父对象parent不是C面向对象里的继承父类是Qt对象树 / 父子对象内存管理这点一定要区分开。⚠区分两个完全不同概念类继承class继承class A(B)B是父类编译期确定。Qt父子对象(parent‑child)运行时设置用于内存管理、窗口层级和类继承无关。buttonQPushButton(点我,window)这里button的父对象是window(QWidget)加入Qt的对象树。1、设置父对象带来两个核心作用① 内存自动释放最重要当父对象被销毁时Qt会自动 delete 它所有的子对象不用你手动 del。流程用户关闭窗口windowwindow对象被销毁。Qt对象树遍历window的全部子对象 →button。自动销毁 button 对象释放内存。如果不设置parentbuttonQPushButton(点我)# 没有父对象窗口关闭window销毁但button没有父Python GC有时候回收不及时容易产生内存泄漏。② 窗口层级关系子控件会绘制在父窗口上面父窗口显示、隐藏子控件跟着显示隐藏。window.show()作为子控件的button自动显示不需要写button.show()。如果父窗口window.hide()button也跟着隐藏。你代码中button设置了父window所以只需要window.show()按钮就自动出来。2、“父退出子类跟着自动退出”是怎么回事关闭窗口不等于程序立刻退出关闭窗口 →window对象被析构销毁。用户点窗口×关闭窗口 →window对象销毁。Qt对象树发现window有子对象button自动销毁button。但是只要app.exec_()事件循环还在运行程序不会退出如果这是程序唯一顶层窗口全部顶层窗口销毁后事件循环结束app.exec_()返回sys.exit()结束进程。简单一句话父对象被销毁所有子对象跟着被销毁内存释放不是直接让程序进程退出。对比两种写法写法A指定 parentwindow你的代码buttonQPushButton(点我,window)window销毁 → button自动释放内存 ✅不用写button.show()写法B不指定parentbuttonQPushButton(点我)button.setParent(window)# 也可以后续函数设置parent效果一样写法C完全没有父对象buttonQPushButton(点我)button.show()# 必须手动show它是独立顶层窗口会弹出第二个小窗口不设置父QPushButton就变成一个独立弹出窗口而不是嵌入到window内部的按钮。这是新手高频踩坑。3、补充布局layout和parent的关系如果你后面用布局管理器buttonQPushButton(点我)layoutQVBoxLayout()layout.addWidget(button)window.setLayout(layout)addWidget(button)会自动把window设置为button的父对象你不需要手动传parent参数。4、总结问答QPushButton第二个参数是父对象parent不是类继承的父类。设置父对象目的✅ Qt对象树自动内存管理父销毁子自动释放避免内存泄漏✅ 子控件嵌入父窗口父show/hide子跟随不用单独show子控件父窗口关闭销毁 →子对象内存被释放不是直接让整个程序进程退出。如果控件没有父对象会变成独立顶层弹窗窗口。小思考题如果把代码改成buttonQPushButton(点我)# 不设置parentbutton.move(150,130)window.show()运行会发生什么答案窗口看不到按钮因为button没有父对象没有加入window界面你还要写button.show()按钮会弹出另外一个独立小窗口。
返回列表