绕过PyQt6的一些小坑

直接进入干货,供遇到相同情况的小伙伴参考。

一、pyuic6导出designer设计的窗体,py代码不完全兼容PyQt6

用Qt Designer设计完界面后,要用pyuic6导出为py文件,再在代码中调用,但直接调用会报错,原因是部分代码(主要是窗体对齐)导出的还是PyQt5的格式。
如导出为:

QtCore.Qt.AlignHCenter

在PyQt6下应该是:

QtCore.Qt.AlignmentFlag.AlignHCenter

需要将所有的对齐代码修改过来。可以用脚本自动处理(在windows下时可用wsl执行)。

awk '{sub(/Qt.AlignH/,"Qt.AlignmentFlag.AlignH");sub(/Qt.AlignL/,"Qt.AlignmentFlag.AlignL
");sub(/Qt.AlignB/,"Qt.AlignmentFlag.AlignB");sub(/Qt.AlignV/,"Qt.AlignmentFlag.AlignV");sub(/Qt.AlignT/,"Qt.AlignmentFlag.AlignT");sub(/Qt.AlignR/,"Qt.AlignmentFlag.AlignR"
);print $0}'

二、自定义图标用pyinstaller打包成exe后运行时不显示

这个不单是PyQt6的问题,PyQt5等版本也存在。主要是图标路径找不到。
看Pyuic6转化后的文件,代码如下:

icon2.addPixmap(QtGui.QPixmap(":/icons/icons/pause.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)

我们将其替换为:

icon2.addPixmap(QtGui.QPixmap(f"{sys_path}/icons/pause.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)

然后在代码开始处,判断系统有无_MEIPASS变量,有的话说明是打包程序,正运行在windows的temp文件夹下;没有这个变量,说明是在VS Code中运行,当前路径就是"./"。这样,我们用如下代码进行判断,并在运行时替换sys_path变量。

import os,sys
sys_path=""
if hasattr(sys,"_MEIPASS"):
    sys_path=sys._MEIPASS
    print(f"system has _MEIPASS path which is {sys._MEIPASS}")
else:
    sys_path="./"
    print(f"system does not have _MEIPASS")' > uiwindow.py
三、替换QTableView编辑模式的默认控件

QTableView用来浏览和修改数据库非常方便,但双击单元格修改时,默认控件是QLineEdit,没有换行,编辑文字量较多时非常不便。可以替换为QTextEdit。代码如下,,首先定义自己想要的控件(这里用TextEdit,也可以用其它控件替换,常见的还有ComboBox):

class MyDelegate(QStyledItemDelegate):
    """自定义tableview的item编辑delegate,用textedit替换lineedit"""
    def createEditor(self, parent, option, index):
        editor = QTextEdit(parent)
        editor.setMinimumSize(400,300)
        return editor

    def setEditorData(self, editor, index):
        value = index.model().data(index,Qt.ItemDataRole.EditRole)
        editor.setText(value)

    def setModelData(self, editor, model, index):
        value=editor.toPlainText()
        model.setData(index,value,Qt.ItemDataRole.EditRole)

然后在窗口代码中将需要的列设置为该delegate:

        delegate=MyDelegate()
        self.tabView.setItemDelegateForColumn(11,delegate)
四、打包成exe后运行时显示cv2错误

这是pyinstaller和opencv的兼容性问题。opencv版本不能过高,可以降级为4.5.3.56,同时,保证opencv-python-headless与opencv-python为同一版本。

pip list
...
opencv-python             4.5.3.56
opencv-python-headless    4.5.3.56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注