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追加元素到列表的方法
Jul 28 Python
基python实现多线程网页爬虫
Sep 06 Python
Python编程之序列操作实例详解
Jul 22 Python
Python进阶之尾递归的用法实例
Jan 31 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
python对离散变量的one-hot编码方法
Jul 11 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
python生成n个元素的全组合方法
Nov 13 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python基于template实现字符串替换
Nov 27 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 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简单静态页生成过程
2008/03/27 PHP
php GUID生成函数和类
2014/03/10 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
jquery操作checkbox示例分享
2014/07/21 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
python的sorted用法详解
2019/06/25 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
求职简历中个人的自我评价
2013/12/01 职场文书
物业总经理岗位职责
2014/02/28 职场文书
岗位职责风险点
2014/03/12 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
九年级化学教学反思
2016/02/22 职场文书
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL