欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PyQt 如何创建自定义QWidget

程序员文章站 2022-04-12 23:44:29
开发环境win7 pycharm python3.5.1 pyqt5主要文件:|-- main.py|-- res| `-- fish.jpg`-- ui `-- app_widget.pymain....

开发环境

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的资料请关注其它相关文章!