PyQt6 Windows环境下qtquickcontrols2windowsstyleimplplugin.dll缺失问题求助
错误信息
QQmlApplicationEngine failed to load component
file:///C:/Users/[blablabla]/GUIt/main.qml:11:9: Type Menu unavailable
qrc:/qt-project.org/imports/QtQuick/Controls/Windows/Menu.qml:32:15: Type MenuItem unavailable
qrc:/qt-project.org/imports/QtQuick/Controls/Windows/MenuItem.qml:7:1: Impossible de charger la bibliothèque C:\Users[blablabla]\Python\Python313\Lib\site-packages\PyQt6\Qt6\qml\QtQuick\Controls\Windows\impl\qtquickcontrols2windowsstyleimplplugin.dll: 找不到指定模块。
(注:法语提示意为“找不到指定模块”)
环境
Windows11系统,非系统自带的Python3.13.3
代码
main.py
from PyQt6.QtWidgets import QApplication from PyQt6.QtQml import QQmlApplicationEngine from backend import Backend app = QApplication([]) engine = QQmlApplicationEngine() backend = Backend() engine.rootContext().setContextProperty("pybackend", backend) engine.load("main.qml") if not engine.rootObjects(): import sys sys.exit(-1) app.exec()
backend.py
from PyQt6.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from PyQt6.QtWidgets import QFileDialog from git import Repo from models.CommitList import CommitListModel class Backend(QObject): repoPathChanged = pyqtSignal() repoNameChanged = pyqtSignal() commitListChanged = pyqtSignal() def __init__(self): super().__init__() self._commit_list = CommitListModel() self._repo_path = "" self.repo = None self._repo_name = "" @pyqtProperty(str, notify=repoPathChanged) def repoPath(self): return self._repo_path @pyqtProperty(str, notify=repoNameChanged) def repoName(self): return self._repo_name @pyqtProperty(QObject, notify=commitListChanged) def commitList(self): return self._commit_list @pyqtSlot() def chooseAndLoadRepo(self): dialog = QFileDialog() dialog.setFileMode(QFileDialog.FileMode.Directory) dialog.setOption(QFileDialog.Option.ShowDirsOnly, True) if dialog.exec(): selected_dirs = dialog.selectedFiles() if selected_dirs: self.loadRepo(selected_dirs[0]) # 加载选中的文件夹 @pyqtSlot() def loadRepo(self, path = "C:/Users/lucie/Hesias/B2/MajorProject/major-project-b2"): try: self.repo = Repo(path) self._repo_path = path self._repo_name = path.split("/")[-1] self.repoPathChanged.emit() self.repoNameChanged.emit() except Exception as e: print(f"错误 : {e}") @pyqtSlot() def loadCommits(self): try: commits = [f"{c.hexsha[:7]}: {c.summary}" for c in self.repo.iter_commits()] print(commits) self._commit_list.setCommits(commits) self.commitListChanged.emit() except Exception as e: self._commit_list.setCommits([f"错误 : {e}"])
models/CommitList.py
from PyQt6.QtCore import QAbstractListModel, Qt, QModelIndex class CommitListModel(QAbstractListModel): def __init__(self, commits=None): super().__init__() self._commits = commits or [] def data(self, index, role): if role == Qt.ItemDataRole.DisplayRole and index.isValid(): return self._commits[index.row()] return None def rowCount(self, index): return len(self._commits) def setCommits(self, commits): self.beginResetModel() self._commits = commits self.endResetModel()
main.qml
import QtQuick import QtQuick.Controls ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("GUIt") MenuBar { Menu { title: "Fichier" Action { text: "Charger un dépôt" onTriggered: pybackend.chooseAndLoadRepo() } // 可以在这里添加更多操作 // Action { // text: "Autre option" // onTriggered: { /* 操作代码 */ } // } } // 添加"Édition"菜单 Menu { title: "Édition" Action { text: "Option 1" onTriggered: { /* 操作代码 */ } } Action { text: "Option 2" onTriggered: { /* 操作代码 */ } } } } Column { anchors.centerIn: parent spacing: 10 Text { text: pybackend.repoPath !== "" ? "Repo actuel : " + pybackend.repoName : "Aucun dépôt chargé" font.pixelSize: 20 } Button { text: "Charger le dépôt" // onClicked: pybackend.loadRepo() onClicked: pybackend.chooseAndLoadRepo() } Button { text: "Charger les commits" onClicked: pybackend.loadCommits() enabled: pybackend.repoPath !== "" } ListView { width: parent.width height: 300 model: pybackend.commitList delegate: Text { text: model.display // 或者用`modelData`如果使用默认角色 font.pixelSize: 14 padding: 4 } } } }
解决方法
- 重装PyQt6确保完整性:执行
pip uninstall pyqt6彻底卸载后,再用pip install pyqt6重新安装,也可以指定稳定版本如pip install pyqt6==6.7.0,避免新版本兼容性问题。 - 检查DLL文件是否存在:前往报错路径
C:\Users\[你的用户名]\Python\Python313\Lib\site-packages\PyQt6\Qt6\qml\QtQuick\Controls\Windows\impl,确认qtquickcontrols2windowsstyleimplplugin.dll是否存在。若缺失,可尝试更换Python版本(比如3.12,3.13较新可能适配不足)。 - 切换QML控件风格:修改main.qml,导入Universal风格并指定,绕过Windows风格插件加载:
import QtQuick import QtQuick.Controls import QtQuick.Controls.Universal ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("GUIt") style: Universal.style(Universal.Light) // 原有MenuBar及其他代码保持不变 } - 添加环境变量:将PyQt6的Qt6/bin目录(如
C:\Users\[你的用户名]\Python\Python313\Lib\site-packages\PyQt6\Qt6\bin)添加到系统PATH中,重启终端后再运行程序。
内容的提问来源于stack exchange,提问作者LuDo_Sniper
相关产品推荐
相关产品推荐

