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 MD5文件生成码
Jan 12 Python
python实现合并两个数组的方法
May 16 Python
Python实现批量修改文件名实例
Jul 08 Python
Python 转义字符详细介绍
Mar 21 Python
深入浅析Python传值与传址
Jul 10 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
使用python接入微信聊天机器人
Mar 31 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
几款好用的python工具库(小结)
Oct 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
php adodb分页实现代码
2009/03/19 PHP
php session安全问题分析
2011/06/24 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
用jscript启动sqlserver
2007/06/21 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
python远程登录代码
2008/04/29 Python
详解Django中的过滤器
2015/07/16 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
html5的localstorage详解
2017/05/09 HTML / CSS
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
会计学生自我鉴定
2014/02/06 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL