PyQt 如何创建自定义QWidget
作者:AnRFDev 发布时间:2023-09-13 17:30:48
标签:python,PyQt,自定义,QWidget
目录
开发环境
主要文件:
main.py
app_main_window.py
Tips
多控件可以存在list中
QApplication与QWidget
注意widget持有外部对象引用的问题
开发环境
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矩形的左上方的点,因此居中显示在我们的屏幕上
Tips
多控件可以存在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_())
来源:https://cloud.tencent.com/developer/article/1783146


猜你喜欢
- python操作mongodb数据库# !/usr/bin/env python# -*- coding:utf-8 -*-"&q
- CREATETABLE`users`(`id`int(10)NOTNULLAUTO_INCREMENT,`name`char(50)NOTN
- 本文实例讲述了vue+php实现的微博留言功能。分享给大家供大家参考,具体如下:html部分:<!doctype html>&l
- 前言之前已经介绍过了Vue + Webpack + Vue-loader的相关功能介绍,大家可以点击这篇文章了解详情。下面就来看看相关配置篇
- 动态添加input并动态添加新验证方式!init状态: 点击“+”后: 验证后:知识点:1 先去官网下载:http://
- 前几天,因为需要实现海外服务端定时停机,涉及到时区的概念。网上搜索了一下,大部分都是谈time.Format中的Layout,非常不成体系,
- 6月初,Python之父Guido van Rossum在今天的PyCon US大会上作了名为“Python Language”的演讲。近日
- 一、柱形图介绍(1)介绍柱状图(Histogram),也称条图(英文:bargraph)、长条图(英文:barchart)、条状图(Bar
- 目录项目介绍已有功能环境安装Windows用看这里ubuntu用户看这里使用方式:主要代码项目地址项目介绍可以下载doc,ppt,pdf.对
- 服务器响应HTTP的类型ContentType大全,使用方法:<% Response.ContentType =&
- 本文实例讲述了Python接收Gmail新邮件并发送到gtalk的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env
- 本文实例展示了Python Tkinter实现简单布局的方法,示例中备有较为详尽的注释,便于读者理解。分享给大家供大家参考之用。具体如下:#
- 我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样
- 本文实例讲述了mysql存储过程原理与使用方法。分享给大家供大家参考,具体如下:存储过程包含了一系列可执行的sql语句,存储过程存放于MyS
- 前言通常我们需要编写好的错误处理方式,在了避免某些程序员滥用异常,于是Go这里直接把异常这一块给砍掉了,最终还是通过返回值来判断程序的异常情
- Flask提供了多种身份认证方式,其中基于Token的身份认证是其中一种常用方式。基于Token的身份认证通常是在用户登录之后,为用户生成一
- 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。该方法的基本思想是:1.先从数列中取出一个数作为基准数
- Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制。在面向对象编程中,可以先预留一个方法接口不实现,在其
- 直接上代码图片就使用我家爽妹子的吧如果没有安装pil模块的话先cmd安装下输入:pip install pillow# -*- coding
- 作为一门脚本语言,写脚本时执行系统命令可以说很常见了,python提供了相关的模块和方法。os模块提供了访问操作系统服务的功能,由于涉及到操