用户登录
用户注册

分享至

PyQt 如何创建自定义QWidget

  • 作者: 呐夜我比刀郎还冲动
  • 来源: 51数据库
  • 2021-08-28

开发环境

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

软件
前端设计
程序设计
Java相关