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之有容乃大的list(2)
Sep 15 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
详解Python发送邮件实例
Jan 10 Python
Django Highcharts制作图表
Aug 27 Python
python中range()与xrange()用法分析
Sep 21 Python
python实现多线程抓取知乎用户
Dec 12 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
python pygame实现球球大作战
Nov 25 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 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常用字符串比较函数实例汇总
2014/11/24 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
安装Python的教程-Windows
2017/07/22 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
升职自荐信
2013/11/28 职场文书
银行学习十八大感想
2014/01/11 职场文书
学历公证书范本
2014/04/09 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2015年项目工作总结
2015/04/29 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python