pyqt5学习笔记
以下记录利用PyQt5开发一个代码规范化检测系统过程中整理的部分学习记录与BUG记录。
- 尺寸策略
sizeHint,期望尺寸
对于大多数控件来说sizeHint只读
比如:self.pushButton.sizeHint().width()读取宽度
最小期望尺寸self.pushButton.minimumSizeHint().width() - 信号与槽函数
信号(signal)与槽函数(slot)是pyqt的核心机制,也是qt的核心机制。
信号:由对象或控件发射出去的消息,比如按钮的单机事件。
槽:本质是一个方法。
信号可以理解为是一个事件,槽就是事件函数。将信号与槽进行绑定来执行相关操作,信号说槽为多对多关系。
信号:Toggled, 描述:当按钮标记状态发生改变时触发该信号。 - 主窗口类型
- QMainWindow
可以包含菜单栏、工具栏、状态栏、标题栏、最常见。 - QWidget
不确定窗口的用途,就用QWidget。 - QDialog
是对话窗口的基类,没有菜单栏、工具栏、状态栏。
- QLable控件
setAlignment():设置文本对齐方式
setIndent():设置文本缩进
text():获取文本内容
setBuddy():设置伙伴关系
selectedText():返回所选择的字符
setWordwrap():设置是否允许换行
- QLable常用信号(事件):
- 当鼠标滑过Qlable控件触发:linkHovered
- 当鼠标单机QLable控件时触发:linkActivited
- QLineEdit控件
基本功能:输入单行文本 - EchoMode(回显模式)
4种回显模式
a. Normal
b. NoEcho 无回显
c.Password 回显星号
d.PasswordEchoOnEdit 先显示出来,再变成星号 - 信号和槽绑定使用时,如果参数除了self还有自己要传进来的,参数用lambda表达式
- 线程
thread.setDaemon()设置为True,则主线程执行完毕后会将子线程回收掉,可避免子线程无限循环;设置为false,主进程执行结束时不会回收子线程。 - 在自定义一个文本编辑器需要显示行号时遇到问题:
在学习Designer中ItemViews类部件时,这些部件都有个父类QAbstractScrollArea,该父类是Qt滚动区域的低级抽象。该区域提供一个称为viewport的中心小部件,在该小部件中滚动区域的内容可以被滚动展现对应内容,即要展现内容的可见部分在viewport中呈现。
- 对viewport的理解:
- QAbstractScrollArea本身都带有viewPort,且缺省情况下viewport大小和QAbstractScrollArea的大小一致;
- 如果出现滚动条,则viewport的大小比QAbstractScrollArea大小要减少滚动条对应区域;
- viewport对应的是设备(如屏幕)的物理区域,QAbstractScrollArea本身的窗口对应的是逻辑区域,逻辑区域和物理区域存在映射,缺省这个映射比例是1:1的。
- 假设需要显示图形,首先把图形映射到窗口,此时可对图形进行旋转、缩放、平移等操作,然后把超出窗口之外的图形裁剪掉(这就是为什么窗口全称为裁剪窗口的原因),然后把图形映射到视口显示出来,若把视口理解为我们的眼睛,则视口和窗口的概念就很容易理解了。窗口的所有内容只有完全映射到了视口的范围内,才能被完全显示,一个窗口的内容可以同时映射到多个视口,即可以从不同的视口去观察窗口中的内容,在窗口到视口的映射过程中,还可对图形进行缩放、平移等简单变换。
BUG记录
- 编写小程序测试时遇到的问题:交互时闪退报错:进程已结束,退出代码 -1073740791 (0xC0000409)。
解决:
经过查找,发现是这里的三个self要有,否则函数pushButton1_clicked中的lineEdit1.setText和上面initUI中的就不是一个对象,运行后,点击按钮,文本框中的字符不能改变,卡顿后报错,修改为上下一致就可以了。图片见BUG文件中图片。
参考博客: - python中字符串不能以反斜杠结尾,可以在结尾加个空格或者后面再写个字符串,否则报错:re.error: bad escape (end of pattern) at position 3
- 利用navicat在数据库中添加外键时报错,错误代码:1215 cannot add foreign key constraint。
解决:
从表关联属性的数据类型,发现没有问题,(选择数据类型时如果没有规定长度,navicat自动使用默认长度,但是默认长度有时候给的不完全相同,我在用smallint类型时使用默认长度,navicat有的给我设为5,有的设为6)另外一点是检查自动增长、非负、是否为空。
我出的问题是有一个属性主表设置了非负,从表没有设置导致。 - pycharm报错Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually.
解决:参考博客 - (1064, “You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘int i,j;\n)’ at line 1”)
解决: sql语句有问题,可能变量名冲突,可能书写不规范
例子:insert_sql = "insert into error (name, ruleid, ruletypeid, line, wrongcode) "
“values(’%s’, ‘%s’, ‘%s’, ‘%s’, ‘%s’)” %
(file_name, _ruleid, _ruletypeid, int(i)+1, str(line_str))
我的问题:values后面%s应该用单引号括起来 - 子窗口打开后闪退
解决: dialog = Login() ,dialog是一个临时变量,使用完会被销毁,改为self.dialog=Login(),变成本类中的变量或者放到本类中的widget中(self.layout.addWidget(…)) - 打开大文件,程序终止报错。python pyqt5 进程已结束,退出代码 -1073740791 (0xC0000409) 这个代码表示缓冲区溢出。
解决: 循环读取文件,使用for line in f,与for line in f.readlines()相比,后者一次性将所有内容读入内存,而前者并没有。改用此方法后出现第二个bug:
bug2:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb8 in position 2: invalid start byte
方法:with open(glo_file_path, encoding= ‘utf-8’,mode=‘r+’) as f:改为如下形式:
with open(glo_file_path, mode=‘r+’) as f: - 测试注释时发现行号单独一行时行号有时候差了一行,调试后发现当初直接过滤注释,在这段注释中遇到/*时直接跳过两个位置pos,这样/*后面可能直接就是回车符,而下面的判断第一步执行了pos+1,导致回车符没有分析直接跳过。
解决: 增加了判断语句 - 打开软件报错:由于找不到msvcp140.dll无法继续执行代码
解决: 在电脑管家里修复没有作用,打开控制面板,大图标显示,找到vc+2017(64),修复后解决。
bug: _recordTab表中添加了None为元素,原因:从word字典中用get方法获取值时没有判断数值是否有效
#代码规范化检测系统
代码规范化检测系统
功能:系统目前可以对一般的c语言程序进行格式化检测,可以判断出现问题所在行,提示如何改进,记录代码更改记录,标记错误改正情况,对检测所用到的规则进行增删该查,自定义使用那些规则检测以及生成正确格式的代码进行对比。
效果:
-
主界面
-
编辑规则
-
配置规则
-
错误信息
-
对比分析结果