PyQt QMainWindow的使用示例


Posted in Python onMarch 24, 2021

QMainWindow继承自QWidget
QMainWindow相当于程序的主界面,内置了menu和toolBar。
使用 Qt Designer 可以很方便地添加menu选项。

对于较大型的界面,用Qt Designer比较方便。.ui文件就像Android中使用xml一样。
画出的ui文件可以用PyQt中的PyUIC转换成py文件。转换后的py文件中有一个class。
新建一个继承自QMainWindow的类,来调用生成的这个类。

主窗口关闭时,会调用closeEvent(self, *args, **kwargs),可复写这个方法,加上一些关闭时的操作。
比如终止子线程,关闭数据库接口,释放资源等等操作。

PyQt5 手写 QMainWindow 示例

Win7  PyCharm  Python3.5.1  PyQt5

手写一个main window,主要使用了菜单栏、文本编辑框、工具栏和状态栏

|-- main.py
|-- res
| `-- sword.png
`-- ui
 `-- app_main_window.py

main.py主文件

import sys
 
from PyQt5.QtWidgets import QApplication
from ui.app_main_window import AppMainWindow
 
if __name__ == '__main__':
 app = QApplication(sys.argv)
 window = AppMainWindow()
 window.show()
 sys.exit(app.exec_())

app_main_window.py窗口实现文件

from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QTextEdit
 
 
class AppMainWindow(QMainWindow):
 """
 菜单栏、文本编辑框、工具栏和状态栏
 """
 
 def __init__(self):
  super().__init__()
  self.init_ui()
 
 def init_ui(self):
  # 菜单栏
  self.statusBar().showMessage('Main window is ready')
  self.setGeometry(500, 500, 450, 220)
  self.setMinimumSize(150, 120)
  self.setWindowTitle('MainWindow')
 
  # 文本编辑框
  text_edit = QTextEdit()
  self.setCentralWidget(text_edit) # 填充剩下的位置
 
  # 定义退出动作
  exit_action = QAction(QIcon('res/sword.png'), 'Exit', self)
  exit_action.setShortcut('Ctrl+Q')
  exit_action.setStatusTip('Exit App') # 鼠标指向选项时在窗口状态栏出现的提示
  # exit_action.triggered.connect(QCoreApplication.instance().quit)
  exit_action.triggered.connect(self.close) # 关闭app
 
  # 定义菜单栏,添加一个选项
  menu_bar = self.menuBar()
  file_menu = menu_bar.addMenu('&File')
  file_menu.addAction(exit_action)
 
  # 定义工具栏,添加一个退出动作
  toolbar = self.addToolBar('&Exit')
  toolbar.addAction(exit_action)

有的时候PyCharm给的代码提示不完全。网上说PyCharm配合vim插件来使用能带来很好的体验。

生成的界面中,工具栏可以自由的拖动,可以放在上下左右4个地方。

同样的代码,可以很方便地移植到PyQt4中。

使用designer画出来的界面

Ubuntu

使用designer绘制好界面后,讲ui文件转换成py代码。

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from ui_main_window import Ui_UAppMainWindow
 
 
class RustMainWindow(QMainWindow):
 """主界面类"""
 
 def __init__(self):
  super(RustMainWindow, self).__init__()
  self.ma = Ui_UAppMainWindow() # designer画的界面
  self.ma.setupUi(self)
 
 
if __name__ == "__main__":
 app = QApplication(sys.argv)
 main_window = RustMainWindow()
 main_window.show()
 sys.exit(app.exec_())

复写__init__初始化方法时需要调用父类方法

PyQt4手写窗口代码

和上面那个功能类似。

import sys
from PyQt4.QtGui import QMainWindow, QTextEdit, QAction, QIcon, QApplication
 
 
class AppMainWindow(QMainWindow):
 def __init__(self):
  super(AppMainWindow, self).__init__()
  self.init_ui()
 
 def init_ui(self):
  self.statusBar().showMessage('Main window is ready')
  self.setGeometry(500, 500, 450, 220)
  self.setMinimumSize(150, 120)
  self.setWindowTitle('MainWindow')
 
  text_edit = QTextEdit()
  self.setCentralWidget(text_edit)
 
  exit_action = QAction(QIcon('res/ic_s1.png'), 'Exit', self)
  exit_action.setShortcut('Ctrl+Q')
  exit_action.setStatusTip('Exit App')
  exit_action.triggered.connect(self.close)
 
  menu_bar = self.menuBar()
  file_menu = menu_bar.addMenu('&File')
  file_menu.addAction(exit_action)
 
  toolbar = self.addToolBar('&Exit')
  toolbar.addAction(exit_action)
 
 
if __name__ == '__main__':
 app = QApplication(sys.argv)
 window = AppMainWindow()
 window.show()
 sys.exit(app.exec_())

可以看出,PyQt4 和 5 的代码基本上是通用的。复写__init__的方法不同。

Python 相关文章推荐
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
发布你的Python模块详解
Sep 15 Python
python WindowsError的错误代码详解
Jul 23 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python PyCharm如何进行断点调试
Jul 05 Python
python解释器spython使用及原理解析
Aug 24 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
PyQt 如何创建自定义QWidget
Mar 24 #Python
解决python 输出到csv 出现多空行的情况
opencv实现图像平移效果
python+selenium小米商城红米K40手机自动抢购的示例代码
Python使用openpyxl复制整张sheet
Mar 24 #Python
基于Python 函数和方法的区别说明
Mar 24 #Python
Pytorch之扩充tensor的操作
Mar 04 #Python
You might like
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
php商品对比功能代码分享
2015/09/24 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
img的onload的另类用法
2008/01/10 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
python读写文件操作示例程序
2013/12/02 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Python中logger日志模块详解
2020/08/04 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技