老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的表头包括水平表头和竖直表头,水平表头每节对应表格的一列,竖直表头对应表格的一行.如图: 上图中的"行"+编号的项就是竖直表头的一个项(也称为1节),"列"+编号的项就是水平表头的一个项(节). 1.设置水平表头的setHorizontalHeaderLabels方法 setHorizontalHeaderLabels用于一次性顺序设置…
老猿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…
我们知道多个视图之间通过使用相同的model就可以实现数据的共享(具体请参考< PyQt学习随笔:ListView控件的视图和数据模型分离案例>),除了数据的共享之外,多个视图之间还可以同步选择项,需要同步选择项的视图首先必须是数据共享的,然后再设置相互之间有相同的选择Model,即选择项的数据存储,则这些同步视图中的一个的数据项选择发生变化会同时引起选择项同步设置了的视图的选择项发生同样的变更. 如果要实现ViewA与ViewB的视图同步,只需要执行如下语句: ViewA.setSelect…
在<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学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的实时变动. 但通过实际的应用实现后发现,变更后的数据如果要更新到后端的数据存储(如文件和数据库)中去时,意味着setData方法要实现后端数据存储的写入,为了保证数据访问的一致性及简洁性,意味着需要在自定义的Model类中实现后端数据存储数据的所有读写删除插入操作,否则自定义类中只实现更新,其他类中实现插入.…
根据<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() 函数接收事件,可以通过在子类中重写该函数来定义自己的事…
除了<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中数据的内容.一般来说: 如果是多行单列的字符数据,可以…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在学习QTableWidgetItem的sizeHint()方法时,Qt自带材料中介绍sizeHint为项的缺省大小,如果没有设置则根据项的数据自动计算项的大小.但老猿试了好久都没明白sizeHint的作用,查阅资料也没有找到相关资料,最终经过2天的反复测试和摸索,终于明白了这个属性的作用. QTableWidgetItem的sizeHint在项对应QHeadView表头的sectionResiz…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidgetItem项的方法setSizeHint用于设置项的sizeHint属性,Qt自带材料中介绍sizeHint为项的缺省大小,如果没有设置则根据项的数据自动计算项的大小.但老猿试了好久都没明白sizeHint的作用,查阅资料也没有找到相关资料,最终经过2天的反复测试和摸索,终于明白了这个属性的作用. QTableWidgetItem的sizeHint在项对应QHeadView表…
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在使用QTextBrowser用于记录输出日志,并接管了标准输出后,对于某些Python模块输出的反映处理进度的提示内容,在pycharm中显示为一行,但在自己的日志文件中显示为N多行.为此分析了一下这些特殊的日志信息,发现是使用'\r'为开头的字符串,即输出不换行但回到行首.为此要做QTextEdit和QTextBrowser实现类似的效果,可以…
最近三天,老猿都在使用PyCharm+QtDesigner工具,通过xlwings读取Excel的数据到TableView中显示的练习,本以为很容易的一件事,断断续续持续了三天时间才终于成功.在这个过程中,遇到了几个定位比较耗时实际上却比较简单的问题,在这儿总结出来供学习这方面内容的同好参考: 一.PyCharm并不能很好的完成语法检查,有时运行时突然终止,仔细核查却发现是基本的语法错误.建议遇到这种问题时,首先使用Python IDLE打开文件进行一次完整语法检查(菜单路径:run->Chec…
1.画水平虚线 直接建一个shape,设置stroke属性就行了,再将这个属性直接作为background的drawable属性引入就行了 注意在4.0以上的真机加一句 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line&q…
在处理数组的时候经常要用到拼接,numpy中有两个非常实用的函数,可以快捷对数组进行拼接 1.hstack(tup)函数可以接收维度相同的数组,进行水平拼接. 2.vstack(tup)用来竖直拼接 演示代码如下: # coding = utf-8 import numpy as np import random t1 = np.arange(12).reshape(2, 6) t2 = np.arange(12, 24).reshape(2, 6) print(t1) print('\n')…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概念 关于逻辑行logicalRow.列logicalColumn和可见行visualRow.列visualColumn的概念,在QTableWidget中没有介绍,老猿查了比较多的资料,并经过验证,最终才搞清楚相关概念.这里有几个关键点要说明一下: 逻辑行和逻辑列是指项本身在部件中存储数据的行和列,是通过setItem将项与QTableWidget的逻辑行和列进行绑定的,也是通过QTable…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget非继承自父类的信号如下: cellActivated(int row, int column):对应项获得了焦点时发射本信号 cellChanged(int row, int column):对应项的各种角色数据发生了变化时发射本信号 cellClicked(int row, int column):对应项鼠标点击时发射本信号 cellDoubleClicked(int r…
专栏: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控制用于调整字符间距,且基本上是英文字符形状的间距,因为英文字符形状都是不规则的,有宽有窄,有的圆乎乎,有的棱角分明,就会导致排列在一起的…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在model/view架构中,有两种方法可以实现排序,选择哪种方法依赖于底层Model.如果model是可排序的,即模型重新实现了QAbstractItemModel.sort()函数,QTableView与QTreeView都提供了API,允许以编程的方式对Model数据进行排序.此外,可以通过把QHeaderView.sortIndicatorChanged()信号与 QTableView.s…
eventFilter函数是直接从QObject继承的定义的事件刷选虚拟函数,如果一个对象A使用installEventFilter函数将另一个对象B安装了B的实例方法eventFilter,则这个对象B将会调用eventFilter进行事件刷选. 修订:上面这段话的描述有误,经过后期学习及测试,eventFilter方法无需是B本身的实例方法,只要是任何一个QObject派生类的eventFilter方法都可以,就是说,安装者.被监视对象以及eventFilter方法所在对象可以是三个独立对象…
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 要支持视图中的数据可以修改,需要两个步骤: 1. 在视图中设置editTriggers属性支持在视图界面触发编辑 editTriggers属性可以在Designer中设置,也可以通过调用setEditTriggers(EditTriggers triggers)来设置,值要设置为非NoEditTriggers的值. editTriggers的属性值确认数据项是否可以编辑,以及如何进入编辑状态. 2…
不同于MVC模式,Model/View设计并不包含用于处理与用户交互的完全独立的部件, 没有将用户交互部分完全分离.一般地,视图负责把模型数据显示给用户,以及处理用户的输入.但是,对于某些特殊要求(比如要求必须输入数字),则交予Delegate(委托)完成. Delegate(委托)组件提供输入功能,同时也能渲染某些特殊数据项.Delegate(委托)就是供视图实现某种高级的编辑功能,在视图中提供输入功能,同时负责传递视图中的单个项.可以说Delegate(委托)是PyQt Model/View…
在PyQt中,模型可以针对不同的组件(或者组件的不同部分,比如存储数据.界面展示数据.按钮的提示等)提供不同的数据.例如,Qt.DisplayRole用于视图的文本显示.通常来说,模型中的数据项包含一系列不同的数据角色,数据角色定义在 Qt.ItemDataRole 枚举中,老猿掌握的包括下列枚举值: Qt.DisplayRole:文本表格中要渲染显示的数据,当存储的内部字典值要显示为可理解的文字含义数据时对应数据与实际存储数据会不一致 Qt.EditRole:编辑器中正在编辑的数据,老猿认为这…
在PyQt中,相似控件发送的信号可以每个控件信号对应一个槽函数,也可以将相似控件的相同信号对应到一个槽函数,但如果槽函数相同,怎么区分信号是谁发送的呢?那就是在信号函数中使用sender()函数获取信号的发送对象. 案例: 设计一个计算器,要求点击相关按键完成计算任务.老猿将计算器的所有按键分为三类,一类是操作数据和符号(包括数字.点.运算符.括号),按下是在显示界面直接显示对应字:第二类是等号直接触发计算:最后一类是清除键,清除显示数据,复位计算器. 设计的界面及信号槽函数连接如下: 老猿将第…
在PyQt中,QWidget类对应基础的窗口组件,如果要在窗口组件关闭时截获关闭事件,提供自己的控制机制,则可以通过在自定义的派生类中重写closeEvent方法. 重写closeEvent方法的语法如下: def closeEvent(self,event): 在重写代码中可以选择接受事件还是忽略事件,接受则只需窗口关闭,忽略则窗口保持不变. 案例: from PyQt5.QtWidgets import QMessageBox,QApplication from PyQt5 import Q…