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基于Tkinter实现的记事本实例
Jun 17 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python 的列表遍历删除实现代码
Apr 12 Python
Python制作钉钉加密/解密工具
Dec 07 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
Python生成数字图片代码分享
Oct 31 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python简单操作excle的方法
Sep 12 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
python BeautifulSoup库的安装与使用
Dec 17 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
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
关于js类的定义
2011/06/28 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
javascript测试题练习代码
2012/10/10 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
python绘图库Matplotlib的安装
2014/07/03 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Python 读写文件的操作代码
2018/09/20 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Python数据存储之 h5py详解
2019/12/26 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
观看信仰心得体会
2014/09/04 职场文书
药店营业员岗位职责
2015/04/14 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
学生病假条范文
2015/08/17 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python