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 18 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
django框架auth模块用法实例详解
Dec 10 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 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 PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
php实现递归的三种基本方式
2020/07/04 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
JS继承用法实例分析
2015/02/05 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python删除某个字符
2018/03/19 Python
python区块及区块链的开发详解
2019/07/03 Python
Python pandas用法最全整理
2019/08/04 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
python3实现飞机大战
2020/11/29 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
自愿离婚协议书范文2014
2014/10/12 职场文书
财务总监岗位职责
2015/02/03 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书