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实现2014火车票查询代码分享
Jan 10 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python识别验证码图片实例详解
Feb 17 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
基于Python爬取素材网站音频文件
Oct 21 Python
python制作抽奖程序代码详解
Jan 15 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
用python批量解压带密码的压缩包
May 31 Python
Flask response响应的具体使用
Jul 15 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
解javascript 混淆加密收藏
2009/01/16 Javascript
javascript 新浪背投广告实现代码
2009/07/07 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Vue页面骨架屏的实现方法
2018/05/22 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
党员评议个人总结
2014/10/20 职场文书
收费员岗位职责
2015/02/14 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
用JS写一个发布订阅模式
2021/11/07 Javascript