代码规范化检测系统开发学习过程记录

pyqt5学习笔记

以下记录利用PyQt5开发一个代码规范化检测系统过程中整理的部分学习记录与BUG记录。

  1. 尺寸策略
    sizeHint,期望尺寸
    对于大多数控件来说sizeHint只读
    比如:self.pushButton.sizeHint().width()读取宽度
    最小期望尺寸self.pushButton.minimumSizeHint().width()
  2. 信号与槽函数
    信号(signal)与槽函数(slot)是pyqt的核心机制,也是qt的核心机制。
    信号:由对象或控件发射出去的消息,比如按钮的单机事件。
    槽:本质是一个方法。
    信号可以理解为是一个事件,槽就是事件函数。将信号与槽进行绑定来执行相关操作,信号说槽为多对多关系。
    信号:Toggled, 描述:当按钮标记状态发生改变时触发该信号。
  3. 主窗口类型
  • QMainWindow
    可以包含菜单栏、工具栏、状态栏、标题栏、最常见。
  • QWidget
    不确定窗口的用途,就用QWidget。
  • QDialog
    是对话窗口的基类,没有菜单栏、工具栏、状态栏。
  1. QLable控件
    setAlignment():设置文本对齐方式
    setIndent():设置文本缩进
    text():获取文本内容
    setBuddy():设置伙伴关系
    selectedText():返回所选择的字符
    setWordwrap():设置是否允许换行
  • QLable常用信号(事件):
    • 当鼠标滑过Qlable控件触发:linkHovered
    • 当鼠标单机QLable控件时触发:linkActivited
  1. QLineEdit控件
    基本功能:输入单行文本
  2. EchoMode(回显模式)
    4种回显模式
    a. Normal
    b. NoEcho 无回显
    c.Password 回显星号
    d.PasswordEchoOnEdit 先显示出来,再变成星号
  3. 信号和槽绑定使用时,如果参数除了self还有自己要传进来的,参数用lambda表达式
  4. 线程
    thread.setDaemon()设置为True,则主线程执行完毕后会将子线程回收掉,可避免子线程无限循环;设置为false,主进程执行结束时不会回收子线程。
  5. 在自定义一个文本编辑器需要显示行号时遇到问题:
    在学习Designer中ItemViews类部件时,这些部件都有个父类QAbstractScrollArea,该父类是Qt滚动区域的低级抽象。该区域提供一个称为viewport的中心小部件,在该小部件中滚动区域的内容可以被滚动展现对应内容,即要展现内容的可见部分在viewport中呈现。
  • 对viewport的理解:
    • QAbstractScrollArea本身都带有viewPort,且缺省情况下viewport大小和QAbstractScrollArea的大小一致;
    • 如果出现滚动条,则viewport的大小比QAbstractScrollArea大小要减少滚动条对应区域;
    • viewport对应的是设备(如屏幕)的物理区域,QAbstractScrollArea本身的窗口对应的是逻辑区域,逻辑区域和物理区域存在映射,缺省这个映射比例是1:1的。
    • 假设需要显示图形,首先把图形映射到窗口,此时可对图形进行旋转、缩放、平移等操作,然后把超出窗口之外的图形裁剪掉(这就是为什么窗口全称为裁剪窗口的原因),然后把图形映射到视口显示出来,若把视口理解为我们的眼睛,则视口和窗口的概念就很容易理解了。窗口的所有内容只有完全映射到了视口的范围内,才能被完全显示,一个窗口的内容可以同时映射到多个视口,即可以从不同的视口去观察窗口中的内容,在窗口到视口的映射过程中,还可对图形进行缩放、平移等简单变换。

BUG记录

  1. 编写小程序测试时遇到的问题:交互时闪退报错:进程已结束,退出代码 -1073740791 (0xC0000409)。
    解决:
    经过查找,发现是这里的三个self要有,否则函数pushButton1_clicked中的lineEdit1.setText和上面initUI中的就不是一个对象,运行后,点击按钮,文本框中的字符不能改变,卡顿后报错,修改为上下一致就可以了。图片见BUG文件中图片。
    参考博客:
  2. python中字符串不能以反斜杠结尾,可以在结尾加个空格或者后面再写个字符串,否则报错:re.error: bad escape (end of pattern) at position 3
  3. 利用navicat在数据库中添加外键时报错,错误代码:1215 cannot add foreign key constraint。
    解决:
    从表关联属性的数据类型,发现没有问题,(选择数据类型时如果没有规定长度,navicat自动使用默认长度,但是默认长度有时候给的不完全相同,我在用smallint类型时使用默认长度,navicat有的给我设为5,有的设为6)另外一点是检查自动增长、非负、是否为空。
    我出的问题是有一个属性主表设置了非负,从表没有设置导致。
  4. pycharm报错Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually.
    解决:参考博客
  5. (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应该用单引号括起来
  6. 子窗口打开后闪退
    解决: dialog = Login() ,dialog是一个临时变量,使用完会被销毁,改为self.dialog=Login(),变成本类中的变量或者放到本类中的widget中(self.layout.addWidget(…))
  7. 打开大文件,程序终止报错。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:
  8. 测试注释时发现行号单独一行时行号有时候差了一行,调试后发现当初直接过滤注释,在这段注释中遇到/*时直接跳过两个位置pos,这样/*后面可能直接就是回车符,而下面的判断第一步执行了pos+1,导致回车符没有分析直接跳过。
    解决: 增加了判断语句
  9. 打开软件报错:由于找不到msvcp140.dll无法继续执行代码
    解决: 在电脑管家里修复没有作用,打开控制面板,大图标显示,找到vc+2017(64),修复后解决。
    bug: _recordTab表中添加了None为元素,原因:从word字典中用get方法获取值时没有判断数值是否有效
    #代码规范化检测系统

代码规范化检测系统

功能:系统目前可以对一般的c语言程序进行格式化检测,可以判断出现问题所在行,提示如何改进,记录代码更改记录,标记错误改正情况,对检测所用到的规则进行增删该查,自定义使用那些规则检测以及生成正确格式的代码进行对比。
效果:

  1. 主界面
    在这里插入图片描述

  2. 编辑规则
    在这里插入图片描述

  3. 配置规则
    在这里插入图片描述

  4. 错误信息
    在这里插入图片描述

  5. 对比分析结果
    在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值