大家好,我是一名热爱Python开发的初三党,当我第一次接触PySide2时,那时的官方文档不是很全,网上教程也相对较少,主要还是PySide2发布较晚的问题,那么我今天就来和大家分享一下我在使用PySide2开发图形界面时遇到的一些问题与解决方案,PyQt5、PySide6同时适用。全文无废话,直接放代码。
问题一 按钮相关问题
1、按钮绑定函数
假设我的按钮名为:yourLabelName,我需要绑定的函数为:yourFunctionName(),直接使用clicked.connect来连接到函数。
self.yourLabelName.clicked.connect(yourFunctionName) # 括号中添加绑定函数名,函数名后不添加括号
2、按钮多次触发函数
之前当我运行我的第一个按钮事件时,突然遇到个严重问题,按下后绑定的函数多次执行,解决方法:条件同上,只需在函数名后加Qt.UniqueConnection即可。解释:与槽连接时Qt默认使用AutoConnection模式,需要更改为UniqueConnection模式来防止重复连接,如果当前信号和槽已经连接过了,就不再连接了。
self.yourLabelName.clicked.connect(yourFunctionName, Qt.UniqueConnection) # 只需在后面加Qt.UniqueConnection即可
问题二 刷新页面问题
1、实现线程实时刷新页面
我之前练习做计时器时,页面刷新问题困扰我好久,直至查阅PyQt5的教程时才得以解决。详情请单击此处链接查看。
其中需要注意的:如果你使用的为Qt Designer生成Python代码,在使用该方法刷新页面时,注意:请将UI类retranslateUi函数中首行代码删除,否则刷新无效,示例如下:
def retranslateUi(self, Widget): # UI类中retranslateUi函数
Widget.setWindowTitle(QCoreApplication.translate("Widget", u"Widget", None)) # 一定要删除该行,否则刷新页面无效果
2、触发按钮刷新页面
def uiUpdate(self): # 定义槽函数,该函数请在类中插入,括号里加self,不然会报错
……
QApplication.processEvents()
学以致用,假设我的按钮名为:yourLabelName,函数绑定示例:
self.yourLabelName.clicked.connect(self.uiUpdate, Qt.UniqueConnection) # 在类中定义的函数须在前面加self
问题三 打包运行问题
1、Pyinstaller 相关
- 不要使用pyinstaller里 -F 单文件打包指令
- 打包后报错提示:"ModuleNotFoundError: No moduel named 'PySide2.QtXml'"时,在打包命令后加 --hidden-import PySide2.QtXml 。例如:假设我需要打包的文件名为pysideExam.pyw
pyinstaller pysideExam.pyw --hidden-import PySide2.QtXml # 其中 --hidden-import 作用为导入丢弃相应报错的包
2、引用 .ui 文件相关
- 如果你使用直接加载 .ui 文件的方式,请将 .ui 文件放置与源文件相同的打包后的路径
例如:我引用的 .ui 文件在原来文件 根目录/UI 文件夹下,那么完成打包后同时要在打包后的路径下新建一个UI文件夹将 .ui 文件存放进去。
问题四 Qt Designer
1、转换为Python代码报错解决方案
若报错为以上内容,那么我们需要打开Designer的路径,创建一个名为"bin"的文件夹,将Designer目录下的uic.exe复制到刚刚创建的文件夹中,这时再次转换就不会报错了。
2、替代品
目前所有软件都重在轻量化,直接转换为python代码会使源代码显得十分臃肿,所以建议大家使用Qt的另一款设计软件:Qt Creator。他可以直接帮你写好引用 .ui 文件的python代码直接调用,十分便捷,且界面相比Designer更现代化,可以点此进行下载(清华源),Windows、MacOS、Linux的安装包都有,请自行选择。该软件安装需要注册Qt账户。
此文章会不断完善,如果您有相同经历、更多的注意事项或有更好的解决方法,欢迎在评论区留言!