在PyQt中,QWidget类对应基础的窗口组件,如果要在窗口组件关闭时截获关闭事件,提供自己的控制机制,则可以通过在自定义的派生类中重写closeEvent方法. 重写closeEvent方法的语法如下: def closeEvent(self,event): 在重写代码中可以选择接受事件还是忽略事件,接受则只需窗口关闭,忽略则窗口保持不变. 案例: from PyQt5.QtWidgets import QMessageBox,QApplication from PyQt5 import Q…
根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意,setData方法调用不光发生在View中实际存储的内部数据修改,也可能是其他与数据相关的属性或值调整,如数据项的checked变化,数据的对齐风格变化等. 因此如果应用需要响应数据的变化实时做出反应而重写setData时,需要判断setData的数据变化的角色,具体来说就是setData方法的参数role…
PyQt程序通过调用QApplication类的exec_()(sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects对象. 在QApplication类中,真正负责事件分发处理的是QApplication类的notify方法(函数),该方法负责向接收者发送事件,返回接收事件对象的处理程序返回的值.请注意,对于发送到任何线程中的任何对象的所有事件,都会调用此方法. 对于…
QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通过sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects对象. QObjects 对象通过调用 QObject.event() 函数接收事件,可以通过在子类中重写该函数来定义自己的事…
我们知道多个视图之间通过使用相同的model就可以实现数据的共享(具体请参考< PyQt学习随笔:ListView控件的视图和数据模型分离案例>),除了数据的共享之外,多个视图之间还可以同步选择项,需要同步选择项的视图首先必须是数据共享的,然后再设置相互之间有相同的选择Model,即选择项的数据存储,则这些同步视图中的一个的数据项选择发生变化会同时引起选择项同步设置了的视图的选择项发生同样的变更. 如果要实现ViewA与ViewB的视图同步,只需要执行如下语句: ViewA.setSelect…
在<PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的实时变动. 但通过实际的应用实现后发现,变更后的数据如果要更新到后端的数据存储(如文件和数据库)中去时,意味着setData方法要实现后端数据存储的写入,为了保证数据访问的一致性及简洁性,意味着需要在自定义的Model类中实现后端数据存储数据的所有读写删除插入操作,否则自定义类中只实现更新,其他类中实现插入.…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget对项的操作支持选中多个项的情况下,可以通过方法selectedRanges返回选中矩形的列表,通过方法setRangeSelected将指定矩形范围的项选中或去选中.相关方法调用语法如下: list[QTableWidgetSelectionRange] selectedRanges() setRangeSelected( QTableWidgetSelectionRan…
按照<PyQt学习随笔:Model/View中设置视图数据项可编辑的方法>的方法支持视图数据可编辑后,编辑后的数据无需主动保存,PyQt会自动将界面变更的数据保存到对应的Model存储中,如果知道变化数据所在的行和列,就可以对该数据进行访问,访问方法是先通过行和列得到数据的Index,然后通过Index访问对应数据值.如: i = self.tableViewModel.index(1,1) d1 = i.data(Qt.DisplayRole) d2 = i.data(Qt.EditRole…
在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展现并接受用户操作.在实现时,Model和View的交互过程有如下几种: 1.初始化时,通过view类的setModel函数将View和Model进行关联: 2.在项目中,Model中的数据一般来源于数据源(如数据库.文件.消息等),由Model负责数据的读取.更新.增加和删除,数据变化后,会自动发dataCh…
老猿是按照<第15.5节 PyQt5安装与配置>步骤安装的PyQt及相关工具,但最近在Qt Designer中点击帮助相关菜单时报错找不到assistant.exe文件,如图: 按照报错信息查看相关目录:C:\Program Files\Python37\Lib\site-packages\pyqt5_tools\Qt\bin\bin,发现不存在该目录,但最后一个bin子目录去掉后的目录即C:\Program Files\Python37\Lib\site-packages\pyqt5_too…
在往Model中通过QStandardItem等类插入数据项时,除了实际插入的存储数据,还可以设置不同角色(请参考<PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及含义>)的数据到数据项中,这样可以对数据项设置诸如是否有可勾选.对齐方式等角色数据. 可参考如下代码: newitem = QStandardItem(data) #print(f"line[col]={line[col]},newitem={newitem},data={newitem.te…
除了<PyQt学习随笔:Qt事件QEvent.type类型常量及其含义资料速查>介绍的Qt已经定义的事件外,Qt还支持自定义事件. 为了方便起见,可以使用 registerEventType()函数为应用程序注册和保留自定义事件类型.这样做可以避免意外地重新使用应用程序中其他地方已在使用的自定义事件类型. 用户自定义事件的值必须在QEvent.User事件到QEvent.MaxUser事件之间,其中QEvent.User事件的常量值为1000,QEvent.MaxUser事件的常量值为6553…
老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相关类的对象在Qt Designer中可以直接构建,但Model相关类的对象必须代码实现,那么怎么去构造Model相关的对象与View匹配呢? 其实Model构建的方法与View类别相关,但View类别并不是唯一确认Model构建方法的要素,还要看View中数据的内容.一般来说: 如果是多行单列的字符数据,可以…
modal属性表示窗口执行show()操作时是以模态窗口还是非模态窗口形式展示,缺省为False,设置该值与QWidget.windowModality的值设置为 Qt.ApplicationModal一样(请参考<PyQt(Python+Qt)学习随笔:模式窗口的windowModality属性与modal属性>). 可以通过isModal()查看该属性的值,使用setModal(bool modal)设置该属性的值. 当窗口是通过exec() 方式展示出来时,不论该属性是否设置都等同于QW…
resize(width,height) resize可以直接调整窗口的尺寸,调整效果类似于鼠标直接拉伸或缩小窗口,但窗口大小的最大值.最小值受窗口的sizePolicy.sizeHint.minimumSize.maximumSize.minimumSizeHint.拉伸因子以及窗口布局的sizeConstraint约束策略的影响,详细影响请参考<PyQt(Python+Qt)学习随笔>有关博文的内容. showMaximized() 将窗口最大化,窗口的左上角与屏幕左上角重合.但经老猿测试…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在使用QTextBrowser用于记录输出日志,并接管了标准输出后,对于某些Python模块输出的反映处理进度的提示内容,在pycharm中显示为一行,但在自己的日志文件中显示为N多行.为此分析了一下这些特殊的日志信息,发现是使用'\r'为开头的字符串,即输出不换行但回到行首.为此要做QTextEdit和QTextBrowser实现类似的效果,可以…
最近三天,老猿都在使用PyCharm+QtDesigner工具,通过xlwings读取Excel的数据到TableView中显示的练习,本以为很容易的一件事,断断续续持续了三天时间才终于成功.在这个过程中,遇到了几个定位比较耗时实际上却比较简单的问题,在这儿总结出来供学习这方面内容的同好参考: 一.PyCharm并不能很好的完成语法检查,有时运行时突然终止,仔细核查却发现是基本的语法错误.建议遇到这种问题时,首先使用Python IDLE打开文件进行一次完整语法检查(菜单路径:run->Chec…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的表头包括水平表头和竖直表头,水平表头每节对应表格的一列,竖直表头对应表格的一行.如图: 上图中的"行"+编号的项就是竖直表头的一个项(也称为1节),"列"+编号的项就是水平表头的一个项(节). 1.设置水平表头的setHorizontalHeaderLabels方法 setHorizontalHeaderLabels用于一次性顺序设置…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidgetItem项的方法setSizeHint用于设置项的sizeHint属性,Qt自带材料中介绍sizeHint为项的缺省大小,如果没有设置则根据项的数据自动计算项的大小.但老猿试了好久都没明白sizeHint的作用,查阅资料也没有找到相关资料,最终经过2天的反复测试和摸索,终于明白了这个属性的作用. QTableWidgetItem的sizeHint在项对应QHeadView表…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在学习QTableWidgetItem的sizeHint()方法时,Qt自带材料中介绍sizeHint为项的缺省大小,如果没有设置则根据项的数据自动计算项的大小.但老猿试了好久都没明白sizeHint的作用,查阅资料也没有找到相关资料,最终经过2天的反复测试和摸索,终于明白了这个属性的作用. QTableWidgetItem的sizeHint在项对应QHeadView表头的sectionResiz…
js: /*弹出对话框方法开始*//** 弹窗方法(需要回传值时,自定义回调方法)* @url: 弹出窗口页面url* @width: 宽度* @height: 高度* @callback: 回调函数 * @title: 标题名*/function custom_openDialog_callBack(url, width, height, title, callback) {    var options = SP.UI.$create_DialogOptions();    options.…
js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器,下面以一个示例为大家详细介绍下具体的实现方法,感兴趣的朋友可以参考下   js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器.   <html> <head /> <body> <script type="text/javascript"> function closeWin(){ window.opener=null; window.…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在写一个测试代码时,发现无论怎么设置窗口以及子部件的布局和大小约束相关的内容,部件的大小就是不能随窗口缩放自动调整,试了很久,甚至怀疑是运行环境出问题重启机器都不行,而其他代码都正常.最后才发现自己范了个低级错误,是因为主窗口在UI设计时是使用的QWidget对象,但在界面派生类内,其父类使用的是QMainWindow而执行代码语法检查没有问题,但…
在PyQt的组件对象中,都有从QWidget中继承的方法event,而QWidget.event是对QObject类定义的虚拟方法event的实现. event方法的语法: bool event(QEvent e) event方法用于接收发给一个对象的事件,如果事件被识别并处理应该返回True,对于没有被应用识别和处理的事件,需要调用父类的event方法以保证事件的正确处理. 注意: 1.该方法中只能捕获确认是发给对应对象的事件,不能捕获通过该对象转发给上级的事件: 2.通过重写该方法可以捕获对…
老猿Python博文目录 老猿Python博客地址 在Qt Designer中,可以在一个窗体上拖拽左边的布局部件,在窗口中进行布局管理,但除了基于窗体之上进行布局之外,还需要窗体本身也进行布局管理才能发挥布局的作用. Designer中窗体进行布局设置 要设置窗体本身的布局,通过鼠标右键点击窗体之后出现的快捷菜单中选择"Lay out". 注意:需要在窗口上已经放置至少有一个子部件之后才能设置.否则弹出菜单中相关设置会不能操作,如图: 放置子部件后,就可以设置窗口本身的布局了,如图:…
对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获.setData方法是视图中各种角色数据发生更新后视图用于更新Model数据的方法,只要重写该方法就可以截获视图对Model数据的修改. 不过网上介绍的思路都是从QAbstractTableModel派生出一个自己的Model类,并实现相关方法,比较复杂.老猿还需要仔细研究这种方法的详细方式及优缺点,相关文章大部分都是基于Qt实现的,懂C…
eventFilter函数是直接从QObject继承的定义的事件刷选虚拟函数,如果一个对象A使用installEventFilter函数将另一个对象B安装了B的实例方法eventFilter,则这个对象B将会调用eventFilter进行事件刷选. 修订:上面这段话的描述有误,经过后期学习及测试,eventFilter方法无需是B本身的实例方法,只要是任何一个QObject派生类的eventFilter方法都可以,就是说,安装者.被监视对象以及eventFilter方法所在对象可以是三个独立对象…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析>介绍了PyQt中各种事件捕获的方法,其实某些特殊情况下,不想对需要捕获事件对象的类进行子类化(如针对Designer中可视部件在界面中布局的对象,子类化后就不能利用Designer直接部署部件),而安装事件过滤方法又麻烦,针对这种情况…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例方法中定义,否则后面发射信号和连接槽方法时都会报错. 案例: class configWin(ui_configWin.Ui_configWin,QtWidgets.QWidget): def __init__(self,parent=None): super().__init__(parent)…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 引言 在Designer中,QWidget的font属性有两个比较陌生的属性:kerning和Antialiasing,如图: kerning属性 kerning属性用于控制字体在输出时是否启用kerning控制,启用kerning控制用于调整字符间距,且基本上是英文字符形状的间距,因为英文字符形状都是不规则的,有宽有窄,有的圆乎乎,有的棱角分明,就会导致排列在一起的…