解決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 <module>
    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的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,成功!如下:
在這裏插入圖片描述

總結

主要原因是Python和PySide2版本不兼容導致的,需要更新Python版本。
還有一個遺留問題:D:\Anaconda3\Library\qmlD:\Anaconda3\Lib\site-packages\PySide2\qml下都有qml包,爲什麼Anaconda下的Python只使用前者?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章