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入门篇之列表和元组
Oct 17 Python
python单例模式实例分析
Apr 08 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
基于Python3.6+splinter实现自动抢火车票
Sep 25 Python
Python3爬虫学习入门教程
Dec 11 Python
把pandas转换int型为str型的方法
Jan 29 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
微信小程序python用户认证的实现
Jul 29 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
python 多线程爬取壁纸网站的示例
Feb 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
PHP中的串行化变量和序列化对象
2006/09/05 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
prototype1.4中文手册
2006/09/22 Javascript
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
Django实现内容缓存实例方法
2020/06/30 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
人与自然观后感
2015/06/16 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
详解MySQL集群搭建
2021/05/26 MySQL
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android