PyQt 如何创建自定义QWidget

 更新时间:2021年03月19日 14:36:34   作者:AnRFDev  
这篇文章主要介绍了PyQt 如何创建自定义QWidget,帮助大家更好的理解和学习使用pyqt,感兴趣的朋友可以了解下

开发环境

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_())

以上就是PyQt 如何创建自定义QWidget的详细内容,更多关于PyQt 创建自定义QWidget的资料请关注脚本之家其它相关文章!

相关文章

  • Linux下远程连接Jupyter+pyspark部署教程

    Linux下远程连接Jupyter+pyspark部署教程

    这篇文章主要为大家详细介绍了Linux下远程连接Jupyter+pyspark部署教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python简单进程锁代码实例

    Python简单进程锁代码实例

    这篇文章主要介绍了Python简单进程锁代码实例,本文讲解了线程和进程的相关知识,然后给出了Python的实现代码,需要的朋友可以参考下
    2015-04-04
  • 如何使用django的MTV开发模式返回一个网页

    如何使用django的MTV开发模式返回一个网页

    这篇文章主要介绍了如何使用django的MTV开发模式返回一个网页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • TensorFlow2基本操作之 张量排序 填充与复制 查找与替换

    TensorFlow2基本操作之 张量排序 填充与复制 查找与替换

    这篇文章主要介绍了TensorFlow2基本操作之 张量排序 填充与复制 查找与替换,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 使用IPython下的Net-SNMP来管理类UNIX系统的教程

    使用IPython下的Net-SNMP来管理类UNIX系统的教程

    这篇文章主要介绍了使用IPython下的Net-SNMP来管理类UNIX系统的教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • python读写ini配置文件方法实例分析

    python读写ini配置文件方法实例分析

    这篇文章主要介绍了python读写ini配置文件方法,实例分析了Python针对ini配置文件的相关读写技巧,需要的朋友可以参考下
    2015-06-06
  • Python Numpy 控制台完全输出ndarray的实现

    Python Numpy 控制台完全输出ndarray的实现

    这篇文章主要介绍了Python Numpy 控制台完全输出ndarray的实现方式,希望给大家做个参考,一起跟随小编过来看看吧
    2020-02-02
  • 百分百成功的全网最简约sklearn环境配置教程

    百分百成功的全网最简约sklearn环境配置教程

    这篇文章主要介绍了百分百成功的全网最简约sklearn环境配置教程,图文全流程讲解包简单易懂,百分百成功,需要的朋友可以参考下
    2023-03-03
  • Python设计模式行为型责任链模式

    Python设计模式行为型责任链模式

    这篇文章主要介绍了Python设计模式行为型责任链模式,责任链模式将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系,下围绕改内容介绍具有一点的参考价值,需要的朋友可以参考下
    2022-02-02
  • pycharm 主题theme设置调整仿sublime的方法

    pycharm 主题theme设置调整仿sublime的方法

    今天小编就为大家分享一篇pycharm 主题theme设置调整仿sublime的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论