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工程师面试题 与Python基础语法相关
Jan 14 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python清除字符串前后空格函数的方法
Oct 21 Python
Python3 单行多行万能正则匹配方法
Jan 07 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
python异常触发及自定义异常类解析
Aug 06 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
Python 使用type来定义类的实现
Nov 19 Python
python 统计文件中的字符串数目示例
Dec 24 Python
PageFactory设计模式基于python实现
Apr 14 Python
解决Keras中CNN输入维度报错问题
Jun 29 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
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
jquery自定义表格样式
2015/11/23 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python杀死一个线程的方法
2015/09/06 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
实现Python与STM32通信方式
2019/12/18 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
信息技术教学反思
2014/02/12 职场文书
暑期社会实践感言
2014/02/25 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python
linux下安装redis图文详细步骤
2021/12/04 Redis