You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6 Windows环境下qtquickcontrols2windowsstyleimplplugin.dll缺失问题求助

PyQt6 QML MenuBar加载失败:找不到Windows风格插件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:25:05