writed by kim @shanghai 20230526
PyQt5有两种授权协议:GPL开源协议或商用闭源协议。 前者意味着直接使用PyQt5的程序也需要基于GPL协议开源,而后者需要支付购买费用,才能闭源使用。前者你就不能申请软著了。如果你既想享受Qt的强大功能,又想闭源商用,那么PySide完全适合你。那么怎么转呢?
笔者实践了一下,欢迎大家一起交流。
在将 PyQt5 代码转换为 PySide6 之后,如果应用程序突然崩溃,可能是由于库之间的差异导致的。为了解决这个问题,我们需要检查代码中的其他部分,以确保所有 PyQt5 特定的部分都已替换为 PySide6。
1、请确保已将所有 PyQt5 导入替换为 PySide6 导入。
例如,将:
from PyQt5.QtCore import QUrl, Qt, QObject, QSize, QMetaObject, pyqtSlot, pyqtSignal
更改为
from PySide6.QtCore import QUrl, Qt, QObject, QSize, QMetaObject, Slot, Signal
from PySide6.QtCore import QUrl, Qt, QObject, QSize, QMetaObject, Slot, Signal
2、比如pyqt里面用的比较多的信号发射怎么改呢
pyqt5
QMetaObject.invokeMethod(self, "updateUI", Qt.QueuedConnection)
from PyQt5.QtCore import QUrl, Qt, QObject, pyqtSignal, QSize, QMetaObject, pyqtSlot
from PyQt5.QtGui import QPixmap, QStandardItemModel, QStandardItem, QIcon, QImage, QPainter, QPainterPath, QFont, \
QDesktopServices, QColor
class UIListUpdater(QObject):
updateUI = pyqtSignal(int, list)
# 文字适配器
class UIStringUpdater(QObject):
updateStringUI = pyqtSignal(int, str)
# 图像适配器
class UIImageUpdater(QObject):
updateImageUI = pyqtSignal(int, QPixmap)
pyside6
首先引用要改为pyside6的引用
from PySide6.QtCore import QObject, Signal
from PySide6.QtGui import QPixmap
然后更改信号部分
QMetaObject.invokeMethod(self, "updateUI", Qt.ConnectionType.QueuedConnection)
class UIListUpdater(QObject):
updateUI = Signal(int, list)
# 文字适配器
class UIStringUpdater(QObject):
updateStringUI = Signal(int, str)
# 图像适配器
class UIImageUpdater(QObject):
updateImageUI = Signal(int, QPixmap)
3、插槽更改
把@pyqtSlot()更改为@Slot()
@Slot()
def updatePatchOKWidget(self):
self.patchOKList.clear()
for item in self.patchOKData:
patchOKItem = PatchOKItem(item["channelName"], item["gameName"], item["targetDirectory"], item["fileName"])
listItem = QListWidgetItem(self.patchOKList)
listItem.setSizeHint(patchOKItem.sizeHint())
self.patchOKList.addItem(listItem)
self.patchOKList.setItemWidget(listItem, patchOKItem)
self.tw.setTabText(1, "成功(" + str(len(self.patchOKData)) + ")")
4、窗口大小问题
在将 PyQt5 代码转换为 PySide6 之后,窗口大小可能会发生变化。这可能是由于两个库在渲染和布局方面的微小差异导致的。要解决这个问题,我们可以尝试调整窗口和控件的大小以适应 PySide6。
首先,检查代码中的 setFixedSize() 方法调用。我们可以尝试调整这些值以获得所需的窗口大小。例如,在 Login 类中,您可以尝试更改以下行:
self.setFixedSize(484, 707)
self.setFixedSize(新的宽度, 新的高度)
此外,检查布局和控件的大小设置。我们可以尝试调整 setFixedSize()、setMinimumSize() 和 setMaximumSize() 方法的参数,以及调整布局的间距和边距。
5、借助Qt Designer
如果仍然无法解决一些转换问题,我们可以尝试使用 Qt Designer 设计 UI,并使用 uic 工具将 .ui 文件转换为适用于 PySide6 的 Python 代码。
注意转换方式pyside6和pyqt5不一样
pyqt5转换Qt Designer设计的UI指令
pyuic5 -o GameSetting.py GameSetting.ui
pyside6转换Qt Designer设计的指令
pyside6-uic.exe login.ui -o ui_login.py
然后对比里面的代码,辅助我们解决这类问题
但是我一般不会使用Qt Designer设计的UI然后转成代码使用,我都是直接根据UI布局自己手工敲代码,Qt Designer适合新手过渡使用。
原因如下:后续出现版本更新,比如每次界面发生更新时都要重新转换一次,比较麻烦;另外,如果直接在UI文件中添加自己的代码,如信号与槽等动作的设计,当UI有更新时都会覆盖自己添加的代码,反复这样搞自己会崩溃,显然不合理。
目前发现有两种方式可以避免上面的问题,
第一种,继承UI文件中的类,自己的代码添加在继承类中;
第二种,在自己的类中加载UI文件,不需要转换UI文件,就是我说的自己写布局,用代码实现,前提是你对各个控件UI很了解。
个人使用下来发现Qt Designer适合那些对api不熟悉的同学使用,把作为一种参考。本人实践下来会发现qt的布局设计跟android 和flutter的布局设计思想很像,会android和flutter页面设计的同学上手很快。你写完一个界面发现你的代码比qt designer生成的代码简洁多了,qt designer生成的代码很臃肿。
本文暂时没有评论,来添加一个吧(●'◡'●)