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中实现结构相似的函数调用方法
Mar 10 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python使用rpc框架gRPC的方法
Aug 24 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
Python assert关键字原理及实例解析
Dec 13 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
python基于SMTP协议发送邮件
2019/05/31 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
django实现日志按日期分割
2020/05/21 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
竞选班干部演讲稿100字
2014/08/20 职场文书
警察群众路线整改措施
2014/09/26 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
介绍信如何写
2015/01/31 职场文书
大明湖导游词
2015/02/03 职场文书
财务总监岗位职责
2015/02/03 职场文书
八一建军节主持词
2015/07/01 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记