PyQt 如何创建自定义QWidget


Posted in Python onMarch 24, 2021

开发环境

Win7  PyCharm  Python3.5.1  PyQt5

主要文件:

|-- main.py
|-- res
| `-- fish.jpg
`-- ui
 `-- app_widget.py

main.py

import sys
 
from PyQt5.QtWidgets import QApplication
 
from ui.app_widget import AppQWidget
 
if __name__ == '__main__':
 app = QApplication(sys.argv)
 w = AppQWidget()
 w.show()
 
 sys.exit(app.exec_())

app_main_window.py

自定义了一个居中显示的窗口,关闭时弹确认框

from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QPushButton, QDesktopWidget, QMessageBox
 
 
class AppQWidget(QWidget):
 """
 A custom QWidget by Rust Fisher
 """
 
 def __init__(self):
  super().__init__()
  self.init_ui()
 
 def init_ui(self):
  # self.setGeometry(300, 300, 400, 200) # 相当于move和resize
  self.resize(300, 200)
  self.move_to_center()
  self.setWindowTitle('Demo1')
  self.setWindowIcon(QIcon('res/fish.jpg'))
 
  btn1 = QPushButton('Quit', self)
  btn1.setToolTip('Click to quit')
  btn1.resize(btn1.sizeHint())
  btn1.move(200, 150)
  btn1.clicked.connect(QCoreApplication.instance().quit) # cannot locate function connect
 
 def closeEvent(self, event):
  reply = QMessageBox.question(self, 'Message',
          'Are you sure to quit now?',
          QMessageBox.Yes | QMessageBox.No,
          QMessageBox.No)
  if reply == QMessageBox.Yes:
   event.accept()
  else:
   event.ignore()
 
 def move_to_center(self):
  qr = self.frameGeometry()
  cp = QDesktopWidget().availableGeometry().center() # got center info here
  qr.moveCenter(cp)
  self.move(qr.topLeft()) # 应用窗口的左上方的点到qr矩形的左上方的点,因此居中显示在我们的屏幕上

多控件可以存在list中

存在一起,需要对整体操作时直接遍历列表

# 同组的控件可以存在同一个list中
 self.cb_list = [
  self.ma.i2cCB,
  self.ma.mipiCB,
  self.ma.eepromCB,
  self.ma.tem_sensorCB,
  self.ma.lensCB,
  self.ma.vcmCB,
  self.ma.mirrorCB,
  self.ma.mirrorCaliCB, ]
 
 self.test_count_et_list = [
  self.ma.i2cCountEt,
  self.ma.mipiCountEt,
  self.ma.eepromCountEt,
  self.ma.tem_sensorCountEt,
  self.ma.lensCountEt,
  self.ma.vcmCountEt,
  self.ma.mirrorCountEt,
  self.ma.mirrorCaliCountEt,
 ]
 
# 需要操作某组控件时 直接遍历列表
def _click_test_item_cb(self):
 """ Update [choose all checkbox] by all test item state """
 choose_all = True
 for cb in self.cb_list:
  choose_all = choose_all & cb.isChecked()
 self.ma.selecteAllCB.setChecked(choose_all)

QApplication与QWidget

QApplication是一个单例,在QWidget中可以通过QApplication.instance()获取到对象

实际上在实例化QApplication前就使用QtGui.QWidget()是会报错的

>>> QtGui.QWidget()
QWidget: Must construct a QApplication before a QPaintDevice

参考 How QApplication() and QWidget() objects are connected in PySide/PyQt?

在我们自定义的QMainWindow中,也可以直接获取到QApplication的实例。

class RustMainWindow(QMainWindow):
 """ This is the main class """
 
 def _trigger_english(self):
  print "Change to English", QApplication.instance()
 
# Change to English <PyQt4.QtGui.QApplication object at 0x02ABE3A0>

注意widget持有外部对象引用的问题

如果在程序启动的地方将引用交给widget,退出时会造成应用无法关闭的问题(类似内存泄漏)。

if __name__ == '__main__':
 app = QApplication(sys.argv)
 # 这里把app交给了MainWindow,MainWindow关闭时是无法正常退出应用的
 main_d = RustMainWindow(app) # 不建议这么做
 main_d.show()
 sys.exit(app.exec_())

 

Python 相关文章推荐
Python常用模块介绍
Nov 21 Python
Python 探针的实现原理
Apr 23 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
python+requests实现接口测试的完整步骤
Oct 27 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
Python3中对json格式数据的分析处理
Jan 28 Python
python 制作网站小说下载器
Feb 20 Python
解决python 输出到csv 出现多空行的情况
opencv实现图像平移效果
python+selenium小米商城红米K40手机自动抢购的示例代码
Python使用openpyxl复制整张sheet
Mar 24 #Python
基于Python 函数和方法的区别说明
Mar 24 #Python
Pytorch之扩充tensor的操作
Mar 04 #Python
快速一键生成Python爬虫请求头
Mar 04 #Python
You might like
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
Symfony控制层深入详解
2016/03/17 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
python函数形参用法实例分析
2015/08/04 Python
详解flask表单提交的两种方式
2018/07/21 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python的sys.path模块路径添加方式
2020/03/09 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
高三励志标语
2014/06/05 职场文书
班级读书活动总结
2014/06/30 职场文书
房屋出售授权委托书
2014/10/12 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
工作收入证明模板
2015/06/12 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫