解决PySide2问题:plugin cannot be loaded for module QtQuick.Controls

背景

近期在学习PySide2相关知识,但是在运行官方的demo时却遇到标题中的问题,折腾了很长时间,最后找到原因,现将整个问题发生及解决过程记录如下。

环境
Win10 x64
Anaconda 3(内含Python3.7.1)
PySide2 5.14.1
VS Code 1.45.1

问题发生过程以及解决方案

(1) 从 https://doc.qt.io/qtforpython/tutorials/qmlintegration/qmlintegration.html下载main.pyview.qml后,导入到VS Code中,运行main.py,

(base) # python main.py --style=marterial
Traceback (most recent call last):
File “main.py”, line 48, in
from style_rc import *
ModuleNotFoundError: No module named ‘style_rc’

解决方案: 这个原因很简单,因为没有安装style_rc,由于不使用它,所以注释掉这一行就行了。

(2) 再次运行main.py,又报了一个错误,

(base) # python main.py --style=marterial
QQmlApplicationEngine failed to load component
file:///E:/workspace_python/PySide/demo_qml/view.qml:43:1: module “QtQuick.Layouts” version 1.12 is not installed

意识是说没有找到QtQuick.Layouts的1.12版本,我们看下view.qml中都引入了哪些版本:

import QtQuick 2.0
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import QtQuick.Controls.Material 2.12

确认已安装的Layouts版本号:
打开D:\Anaconda3\Library\qml\QtQuick\Layouts\plugins.qmltypes,确认Layouts版本号1.3

// This file was auto-generated by:
// ‘qmlplugindump -nonrelocatable QtQuick.Layouts 1.3’

解决方案: 修改Layouts版本号为1.3。

(3) 继续尝试运行main.py,于是就报了标题的错误,也就是今天的重点问题:

(base) # python main.py --style=marterial
QQmlApplicationEngine failed to load component
file:///E:/workspace_python/PySide/demo_qml/view.qml:44:1: plugin cannot be loaded for module “QtQuick.Controls”: ???D:\Anaconda3\Library\qml\QtQuick\Controls.2\qtquickcontrols2plugin.dll???

期初也是在网上搜索是否有类似问题,确实有,但都没有解决我的问题,而且我这里多了一堆?????,一头雾水,直到在PySide2官网中看到下面一段话:https://wiki.qt.io/Qt_for_Python
解决PySide2问题:plugin cannot be loaded for module QtQuick.Controls_第1张图片
这句话的意识是:PySide2的5.14版本在Windows上和Python 3.8.0不兼容,必须是3.8.1或更高版本。

检查PySide2版本: 5.14.1,(我这里能使用grep命令,是因为我安装的cmder,如果是使用默认cmd的话,可以使用findstr替代grep),

(base) # conda list|grep pyside2
pyside2                   5.14.1                   pypi_0    pypi

检查Python版本: 3.7.1,

(base) # python -V
Python 3.7.1

解决方案: 由于这个 Python是Anaconda自带的,所以想着更新下Anaconda,但是发现还没有包含Python3.8的Anaconda版本,于是直接从Python官网下载了最新的纯Python版本:Python 3.8.3,

使用3.8.3来执行main.py,又报错,如下:(注意这里python.exe的全路径包含了空格,所以要用引号括起来)

(base) # "D:\Program Files (x86)\Python3.8\python.exe" main.py --style=material
Traceback (most recent call last):
  File "main.py", line 44, in <module>
    from PySide2.QtCore import QObject, Slot
ModuleNotFoundError: No module named 'PySide2'

解决方案: 这一看就是没有找到PySide2模块,所以需要将其添加到Python的搜索路径中:
D:\Program Files (x86)\Python3.8\Lib\site-packages文件夹新建任意名称的.pth文件,比如我新建的cust.pth,然后将PySide2所在路径加到该文件中,我的PySide2是通过Anaconda 中的pip下载的,路径为:D:\Anaconda3\Lib\site-packages,保存退出。

再次执行:"D:\Program Files (x86)\Python3.8\python.exe" main.py --style=material,成功!如下:
解决PySide2问题:plugin cannot be loaded for module QtQuick.Controls_第2张图片

总结

主要原因是Python和PySide2版本不兼容导致的,需要更新Python版本。
还有一个遗留问题:D:\Anaconda3\Library\qmlD:\Anaconda3\Lib\site-packages\PySide2\qml下都有qml包,为什么Anaconda下的Python只使用前者?

你可能感兴趣的:(Python)