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之用while来循环
Oct 02 Python
打包发布Python模块的方法详解
Sep 18 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
Python Socket编程详细介绍
Mar 23 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
python 读取txt中每行数据,并且保存到excel中的实例
Apr 29 Python
python中字符串内置函数的用法总结
Sep 13 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
python 自动化偷懒的四个实用操作
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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
js实现时钟定时器
2020/03/26 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现输入数字的连续加减方法
2018/06/22 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python实现自动签到脚本功能
2020/08/20 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
Java程序员面试题
2013/07/15 面试题
品质主管的岗位职责
2013/12/04 职场文书
中国梦读书活动总结
2014/07/10 职场文书
村级个人对照检查材料
2014/08/22 职场文书
农行心得体会
2014/09/02 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2014年手术室工作总结
2014/11/26 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python
python脚本框架webpy模板控制结构
2021/11/20 Python