专栏首页AnRFDevPyQt 创建自定义QWidget

PyQt 创建自定义QWidget

PyQt5.QtWidgets 示例

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)

QApplicationQWidget

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下,我觉得PyQT使用起来更加方便,功能也相...

    IT派
  • Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载。

    Vamei
  • Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载。

    Vamei
  • Python应用03 使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下,我觉得PyQT使用起来更加方便,功能也相...

    Vamei
  • [PyQt Tutorial]6.Layout Management(布局管理)

    https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm

    bsbforever
  • PyQt 编程入门(六)

    GUI程序不同于普通的批处理程序,会有一个一直在运行的事件循环,检查诸如鼠标点击、键盘按下等用户事件和诸如计时器超时,窗口重绘、网络连接等系统事件。当我们调用应...

    用户6021899
  • [PyQt Tutorial]2.一个Hello World程序

    https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm

    bsbforever
  • PyQt PySide QListWid

    原文链接:https://stackoverflow.com/questions/25187444/pyqt-qlistwidget-custom-items

    py3study
  • PyQt 5信号与槽的几种高级玩法

    在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会...

    博文视点Broadview
  • python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择

    QMainWindow类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。

    砸漏
  • PyQt入门

    PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。

    里克贝斯
  • 详解PyQt5信号与槽的几种高级玩法

    信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。本文介绍了几种PyQt 5信号与槽的几级玩法。

    砸漏
  • 用 PyQt 打造具有专业外观的 GUI

    如果您一直在创建表单以执行将数据输入数据库等操作,那么QFormLayout适合您。此类将小部件布置为两列布局。第一列通常显示描述预期输入的标签,第二列通常包含...

    sergiojune
  • PyQt5中向单元格添加控件的方法示例

    setItem:将文本放到单元格中 setCellWidget:将控件放到单元格中 setStyleSheet:设置控件的样式(Qt StyleSheet)

    砸漏
  • PyQt4 - 关闭最小化问题

    在这个部分,我们开始学习一些PyQt4的基本功能,解释会比较详细,就像教孩子说话一样。 最简单的example     下面的示例会非常的简单,仅仅显示...

    bear_fish
  • PyQt4 - (2) 第一印象 (pyqt的入门)

    http://www.blogjava.net/glorywine/archive/2008/06/21/206729.html

    bear_fish
  • Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

    一般情况下,应用程序都是单线程运行的,但是对于GUI程序来说,单线程有时候满足不了需求。例如,如果需要执行一个特别耗时的操作,在执行过程中整个程序就会卡顿,效果...

    不脱发的程序猿
  • python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

    QThread是Qt的线程类中最核心的底层类。由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码

    砸漏
  • python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法

    基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类。

    砸漏

扫码关注云+社区

领取腾讯云代金券