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的资料请关注其它相关文章!
上一篇: R语言绘制频率直方图的案例