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实现socket端口重定向示例
Feb 10 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
flask框架中勾子函数的使用详解
Aug 01 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
python单例模式的多种实现方法
Jul 26 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 Python
Django Form设置文本框为readonly操作
Jul 03 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
小程序实现分类页
2019/07/12 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
利用Python破解斗地主残局详解
2017/06/30 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python之array赋值技巧分享
2019/11/28 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
劲霸男装广告词
2014/03/21 职场文书
英语故事演讲稿
2014/04/29 职场文书
工程售后服务方案
2014/06/08 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
汽车销售员工作总结
2015/08/12 职场文书