当前位置 : 主页 > 编程语言 > python >

绕过PyQt6的一些小坑

来源:互联网 收集:自由互联 发布时间:2022-06-14
直接进入干货,供遇到相同情况的小伙伴参考。 一、pyuic6导出designer设计的窗体,py代码不完全兼容PyQt6 用Qt Designer设计完界面后,要用pyuic6导出为py文件,再在代码中调用,但直接调用

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

一、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


上一篇:Python代码自动提取Win10内置的锁屏壁纸
下一篇:没有了
网友评论