【问题标题】:Using anything from QtQuick.Controls throws a protected module error使用 QtQuick.Controls 中的任何内容都会引发受保护的模块错误
【发布时间】:2020-10-11 11:10:32
【问题描述】:

当我尝试启动程序时遇到这些错误:

无法为模块加载插件,无法将类型安装到受保护的模块中

平台:
Python 3.8
PyQt5 5.15.0
Visual Studio 社区 2019
Windows 10 专业版 1909

主要 python 文件(整个事情几乎就是这里的示例:https://codeloop.org/pyqt5-creating-first-window/

import numpy
import os
import sys
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtWidgets import QApplication

def main():
    app =QApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load(os.path.join(os.path.dirname(__file__), "MainApp.qml"))
 
 
    if not engine.rootObjects():
        return -1
 
    return app.exec_()

if __name__ == '__main__':
    main(); 

对应的QML文件“MainApp.qml”:

import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick 2.15

Window {
 
    visible:true
    width:600
    height:400
    color:"yellow"
    title: "PyQt5 QML Window"
 
    Button {
        text: "Something"
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
 
 
}

不使用 QtQuick.Controls 中的任何东西,它可以工作,但是一旦我添加按钮,它就会产生这些错误:

QQmlApplicationEngine failed to load component
file:///C:/Users/elano/Source/Repos/Projekt-1-SS2020/Projekt-1-SS2020/MainApp.qml:15:5: Type Button unavailable
file:///C:/Users/elano/vpqt/lib/site-packages/PyQt5/Qt/qml/QtQuick/Controls.2/qmldir: plugin cannot be loaded for module "QtQuick.Controls": Cannot install type 'VerticalHeaderView' into protected module 'QtQuick.Controls' version '2'
<Unknown File>: Cannot install type 'HorizontalHeaderView' into protected module 'QtQuick.Controls' version '2'
<Unknown File>: Cannot install element 'SplitHandle' into protected module 'QtQuick.Controls' version '2'
...

它尝试查找的文件 (qmldir) 确实存在,并且包含以下内容:

module QtQuick.Controls
plugin qtquickcontrols2plugin
classname QtQuickControls2Plugin
depends QtQuick.Templates 2.5
designersupported

有人知道这里发生了什么吗?需要更多信息吗?

【问题讨论】:

    标签: python qt pyqt pyqt5 qml


    【解决方案1】:

    好吧,现在我觉得自己很愚蠢。我已经有点在我的代码中有我的答案,但由于它没有让 Pyside2 工作,我把它注释掉了......
    问题是,环境变量设置不正确。在我的主文件中的导入语句之后添加它:

    dirname = os.path.dirname(PyQt5.__file__)
    plugin_path = os.path.join(dirname, 'plugins', 'platforms')
    os.environ['QML2_IMPORT_PATH'] = os.path.join(dirname, 'qml')
    

    我发现没有任何教程提到过这一点。太好了。

    【讨论】:

    • 遇到了同样的问题,这段代码 sn-p 解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2011-02-02
    • 2018-05-14
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多