直接进入干货,供遇到相同情况的小伙伴参考。
一、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