PYQT6疑难杂症解决方案

本文最后更新于:2022年6月23日 下午

前言

谁能想到课程设计要用pyqt+qt来写呢?我是没想到的。还好是老师会给课件,这下一周速通了。问题是老师给的pyqt5,而我作死用pyqt6导致自己碰一大堆壁。
所以这篇随笔就是把碰的壁整合一下,不知道以后有没有机会用到(虽然我并不是很喜欢用python来干这种事情(指写GUI和操作数据库))。

正文

QPalette.setColor

在pyqt5里边,是这么写的:palette1.setColor(palette1.Background, QtGui.QColor(255, 210, 210))
但是在pyqt6里边,多了两个东西,ColorRole 和 ColorGroup,这就导致你要这么写:palette1.setColor(palette1.ColorRole.Window, QtGui.QColor('gray'))
上边的Background是被弃用了的,取而代之的是Window,而Window归于ColorRole,所以写法大大地不同(闷了)。

设置某些控件的字体颜色的时候不要用调色盘!!!比如QLabel和QPlainTextEdit,用他们自带的setStyleSheet(),向里面传字符串"color: xx",xx替换成相应颜色。

关于鼠标相关的事件

其实每个组件都已经写好了相关事件,只不过有些组件本来就没必要和鼠标进行交互当然不会触发相关事件。但是我们可以自己编写自己的类,通过继承和重载来对鼠标的信号作出反应。
和鼠标事件有关的方法有:mousePressEvent(self, event)wheelEvent(self, event)mouseDoubieCiickEvent(self, event)mouseReleaseEvent(self, event)mouseMoveEvent(self, event)enterEvent(self, event)leaveEvent(self, event)
分别是:鼠标按下事件、滚轮滚动事件、鼠标双击事件、鼠标释放事件、鼠标移动事件、鼠标进入控件事件和鼠标离开控件事件。鼠标按下事件中可以通过event来获取具体按下的键再来配置更详细的操作。

如果要实现实时监测鼠标移动,需要setMouseTracking(True),否则只会在mousePress的时候触发鼠标移动事件。

关于pyqt6把pyrcc删除了这件事

老师给的课件用的是pyqt5,此时还存在pyrcc5这种东西,但是到了6能编译资源文件的pyrcc就惨遭阉割(误)。结果弄到我在这里卡了挺久,找了个什么pyqt6rc装一下不仅没用还把我pyqt6搞崩了,郁闷。
但是我们可以用pyside6-rcc进行编译(我是没想到的)。我们需要先安装pyside6:pip install pyside6,安装成功后,进入到资源文件所在文件夹中,使用命令:pyside6-rcc res.qrc -o res.py即可编译。
但是pyuic6编译后的py文件中不会自带import res,需要我们手动写进去。

关于我的电脑时区为了登上xbox改成了香港特别行政区结果数字全显示成苏州码子这件事

如果你发现数字显示成苏州码子:〡〢〣〤〥〦〧〨〩
把电脑时区改回来!具体操作:控制面板 -> 时钟和区域 -> 区域,格式改成:中文(简体,中国)。

关于pyCharm读取数据库或文件导致程序崩溃报错-1073740791 (0xC0000409)

菜单栏Run -> Edit Configuration,把Emulate terminal in output console勾选上。

关于pyqt6里边枚举类型是:类名.枚举名.枚举值这件事

简单的例子,pyqt5里边:self.tabModel.setEditStrategy(QSqlTableModel.OnManualSubmit),pyqt6里边:self.tabModel.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)
就这么简单。虽然老师提醒过了但是我一开始根本就没想到这里面是枚举。查文档看到的确存在这种属性,然后又忽略了枚举。闷了很久,突然就灵光一闪这不是枚举值吗,不会是枚举的锅吧!然后就解决了。。。

关于某些时候一些行为触发两次相同的槽函数这件事

本来是不想管的,但是open两次数据库就直接炸了啊我能不管吗?最简单的解决办法:给槽函数上@pyqtSlot()装饰器。

关于QSqlTableMode、QSqlQueryModel、QSqlRelationalTableMode、QSqlQuery这四个东西用来干嘛

在课件里边,老师是这么用的:QSqlTableMode用来写了对数据库进行增删查改等操作的界面,QSqlQueryModel用来写对数据库进行查询的界面,从这里边我们就能很好地总结出:前者可以对数据库进行读写操作,而后者对数据库是只读的。
在网络上也找了一点说法:

提供了一个sql查询结果的只读数据模型。它从查询QSqlQueryModel获取数据。可以方便的用于在QListView, QTableView, QTreeView等各种view上展示数据。但它是只读的,不能编辑。
继承于QSqlQueryModel,与QSqlQueryModel功能相似。比QSqlQueryModel的限制在于不能是任意sql语句,只是对单个数据表操作。拓展在于在各种view上展示表格数据的同时,还允许用户进行编辑操作。

QSqlRelationalTableMode是用来干什么的呢?在课件里边,它被用来做便捷的联合查询操作(也可以对数据表进行操作),且可以快速设置代理组件而不需要自己手写。
还有最后一个QSqlQuery,简单地说就是用来执行sql语句的。

关于pyqt6里的QChart没有axisX()这个东西

这是课件里pyqt5的做法:chart.removeAxis(chart.axisX()) # 删除坐标轴
但是pyqt6他没有啊,他又没有了啊!找了半天有个可以返回全部坐标轴列表的方法,于是我改成了下边的写法:

1
2
3
if chart.axes():
for axis in chart.axes():
chart.removeAxis(axis) # 删除坐标轴

你以为就结束了啊?你要把坐标轴加上去用的也不是setAxisX()而是addAxis()了。详细对比下面两句:

1
2
chart.addAxis(axisStud, Qt.AlignmentFlag.AlignLeft)  # pyqt6写法
chart.setAxisY(axisStud, seriesBar) # pyqt5写法

结语

做完课设人已经麻了,谢谢。


这里有一只爱丽丝

希望本文章能够帮到您~


PYQT6疑难杂症解决方案
https://map1e-g.github.io/2022/06/15/pyqt-essay-1/
作者
MaP1e-G
发布于
2022年6月15日
许可协议