一、ImportError: DLL load failed while importing QtWidgets
PySide6是流行的Python GUI开发选项。最烦人的报错当属ImportError: DLL load failed while importing QtWidgets,其原因是Python的版本和PySide6的版本不兼容。
版本一般只看二级,比如python=3.13.*,pyside6==6.9.*
python的版本历史可以到 https://www.python.org/ 去查。
PySide6的版本历史可以到 https://pypi.org/project/PySide6/#history 去查。
建议conda新建一个干净的环境env,只安装pyside6(或者多安装一个ipykernel,VScode打开ipynb需要),在里面测试python和pyside6的版本兼容性,试好了就可以确定虚拟环境的python版本了,再安装其他库包。
虽然现在conda也可以安装pyside6了,但问题很多,仍然建议pip安装。
本例ibase环境开始python是最新的3.14.7
conda create -n ibase python=3.14.7conda activate ibase
安装pip install pyside6不带版本号默认是最新版6.11.2,报错。
卸载重新安装PySide6到6.11.0不行,6.10.3不行,仍然会报ImportError: DLL load failed while importing QtWidgets错误。
pip安装pyside6需指定版本号。会自动安装相同版本的 PySide6_Addons、PySide6_Essentials、Shiboken6,卸载的时候需要将其一同卸载:
pip uninstall pyside6 pyside6_addons pyside6_essentials shiboken6
继续,安装6.9.3的时候提示不兼容python 3.14,于是删除虚拟环境新建 python=3.13.16(3.13系列的最高版本),然后再安装pip install pyside6==6.9.3(6.9系列最高版本)就行了,不报ImportError: DLL load failed while importing QtWidgets错误了,表示python和pyside6的版本兼容了。
但是会报qt.qpa.plugin: Could not find the Qt platform plugin错误,小问题。
二、qt.qpa.plugin: Could not find the Qt platform plugin
上面解决了大问题,这个只是小问题。
只要程序里有PySide6的GUI组件,就会报这个错。将下面语句放到程序文件的最前面,就可以解决问题。里面的路径根据实际情况修改,注意用“/”作为分隔符。
import osos.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = "C:/miniconda3/envs/ibase/Lib/site-packages/PySide6/plugins/platforms"
上述方法就可以解决大多数可视化组件的问题。但是如果程序里用了QtWebEngineWidgets组件或其子组件,则会报其他类似错误。需要在上面语句后面添加如下语句:
os.environ["QTWEBENGINEPROCESS_PATH"] = "C:/miniconda3/envs/ibase/Lib/site-packages/PySide6/QtWebEngineProcess.exe"os.environ["QTWEBENGINE_RESOURCES_PATH"] = "C:/miniconda3/envs/ibase/Lib/site-packages/PySide6/resources"os.environ["QTWEBENGINE_LOCALES_PATH"] = "C:/miniconda3/envs/ibase/Lib/site-packages/PySide6/translations/qtwebengine_locales"
使用了QtWebEngineWidgets组件,遇到没有显卡的情况,还要增加如下几行
os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer"os.environ["QT_QUICK_BACKEND"] = "software"os.environ["QT_OPENGL"] = "software"
无显卡(比如在虚拟机中)情况比较少见,为避免通常情况下固定使用CPU渲染,可以考虑把上述语句放在try…except…中,而不是文件开头。
try: self.webview=QWebEngineView() layout.addWidget(self.webview) self.webview.setUrl(QUrl(self.url))except Exception: os.environ["QT_QUICK_BACKEND"] = "software" os.environ["QT_OPENGL"] = "software" os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer" self.webview=QWebEngineView() layout.addWidget(self.webview) self.webview.setUrl(QUrl(self.url))
上述做法与在系统里设置环境变量是一个意思。如果在系统里设置了上述变量,则不需要在程序文件里写这些语句。但系统变量只在你的机器里生效,程序打包分发到别人的机器里运行就会出问题。所以上述解决方法是通用的,程序打包分发到别人的机器也有效。
三、其他
PySide6的一些改变:pyqtSignal 改成了 Signal,用法一样。
另外,创建app之后,增加一行app.setStyle(“Fusion”),界面美观很多,尤其在Windows中。
app = QApplication(sys.argv)app.setStyle("Fusion")




发表评论