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常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
python生成IP段的方法
Jul 07 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
一篇文章快速了解Python的GIL
Jan 12 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
python取余运算符知识点详解
Jun 27 Python
pytorch 输出中间层特征的实例
Aug 17 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
django rest framework使用django-filter用法
Jul 15 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 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
php下MYSQL limit的优化
2008/01/10 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
angularjs http与后台交互的实现示例
2018/12/21 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python解析树及树的遍历
2016/02/03 Python
python和ruby,我选谁?
2017/09/13 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python最长回文串算法
2018/06/04 Python
python使用matplotlib绘制热图
2018/11/07 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
Python爬取梨视频的示例
2021/01/29 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
2014最新实习证明模板
2014/10/02 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
生日答谢词
2015/01/05 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js