Python 如何将PyQt中的动态菜单项添加到QML抽屉中

Python 如何将PyQt中的动态菜单项添加到QML抽屉中,python,pyqt,qml,Python,Pyqt,Qml,我目前在将PyQt中的动态菜单项添加到QML抽屉中的QAbstractListModel时遇到了一些问题 在以下链接中可以找到我正在使用的相应QML文件:和 drawer.py: QDrawer类(QQuickView): 关闭按钮\u单击=QtCore.pyqtSignal() 错误\触发=QtCore.pyqtSignal() 在透明帧上单击=QtCore.pyqtSignal() def u uu init uuuuu(self,parent=None,layout=None,drawer

我目前在将PyQt中的动态菜单项添加到QML抽屉中的QAbstractListModel时遇到了一些问题

在以下链接中可以找到我正在使用的相应QML文件:和

drawer.py:

QDrawer类(QQuickView):
关闭按钮\u单击=QtCore.pyqtSignal()
错误\触发=QtCore.pyqtSignal()
在透明帧上单击=QtCore.pyqtSignal()
def u uu init uuuuu(self,parent=None,layout=None,drawermenentrieslist=[],callback=None):
super()。\uuuu init\uuuuu()
self.parent=parent
qmlRegisterType(QPythonBinding,“MyApplication”,1,0,“QPythonBinding”)
#QDrawer的格式
self._格式(QtGui.QColor(QtCore.Qt.transparent))
self.\u source\u qml\u文件(“main.qml”)
self.setResizeMode(self.sizerootObject视图)
self.engine().rootContext().setContextProperty(“QDrawer”,self)
#如果未成功获取QML文件,则阻止继续
如果不是self.engine().rootContext():
error(“无法从源QML文件加载任何对象并从中创建上下文”)
检测到self.error_()
#联系
self.statusChanged.connect(self.on\u statusChanged)
self.transparent_frame=QWidget()
eventFilter\u transparent\u frame=\u Filter(self.transparent\u frame)
self.transparent\u frame.installEventFilter(eventFilter\u transparent\u frame)
eventFilter\u transparent\u frame.released.connect(单击self.transparent\u frame)
在布局(布局)中将抽屉添加到容器
#回调函数被传播到ui_控制器
填充(DrumerNuEntriesList,回调)
logger.debug(f“已创建抽屉”)
...
定义填充(self、drawermenentrieslist、回调):
menu=self.\u通过对象名获取\u qml\u组件(QtCore.QAbstractListModel,“抽屉列表”)
qpybinding=QPythonBinding()
在菜单中输入:
logger.debug(f)≡ [抽屉]:在抽屉模型中添加“{entry}”)
qpybinding.addElement.emit(条目)
生成的抽屉如下所示:


我们的想法是将抽屉菜单中的条目“Fragment X”替换为任何由populate()函数中的“drawermenentrieslist”确定的自定义字符串条目

给予似乎以OP为例的帖子必要的信任

如果分析了QML代码,则只需要从python创建一个模型(例如QStandardItemModel),将其导出到带有setContextProperty的QML,并在ListView中进行设置

导入系统 从PyQt5导入QtCore、QtGui、QtQuick 类QDrawer(QtQuick.QQuickView): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.setResizeMode(self.sizerootObject视图) self.entry_model=QtGui.QStandardItemModel() self.rootContext().setContextProperty(“entry\u model”,self.entry\u model) self.setSource(QtCore.QUrl.fromLocalFile(“main.qml”)) def附加项(自身、条目): it=QtGui.QStandardItem(条目) self.entry\u model.appendRow(it) def main(): app=QtGui.qgui应用程序(sys.argv) w=QDrawer() 对于范围(10)内的i: w、 增编(“条目-{}”。格式(一)) w、 show() sys.exit(app.exec_()) 如果名称=“\uuuuu main\uuuuuuuu”: main() main.qml

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

Rectangle {
    id: window
    width: 360
    height: 520
    color: "#00000000"
    readonly property int dpi: Screen.pixelDensity * 25.4
    function dp(x){ return (dpi < 120) ? x : x*(dpi/160); }

    // Application Bar
    Rectangle {
        id: menuRect
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        height: dp(48)
        color: "#4cd964"

        // Icon-Hamburger
        Rectangle {
            anchors.top: parent.top
            anchors.bottom: parent.bottom
            anchors.left: parent.left

            width: dp(48)
            color: "#4cd964"

            Rectangle {
                anchors.top: parent.top
                anchors.topMargin: dp(16)
                anchors.left: parent.left
                anchors.leftMargin: dp(14)
                width: dp(20)
                height: dp(2)
            }

            Rectangle {
                anchors.top: parent.top
                anchors.topMargin: dp(23)
                anchors.left: parent.left
                anchors.leftMargin: dp(14)
                width: dp(20)
                height: dp(2)
            }

            Rectangle {
                anchors.top: parent.top
                anchors.topMargin: dp(30)
                anchors.left: parent.left
                anchors.leftMargin: dp(14)
                width: dp(20)
                height: dp(2)
            }

            MouseArea {
                anchors.fill: parent

                onClicked: {
                    nav.toggle()
                }
            }
        }

    }

    Label{
        id: label
        anchors.top: menuRect.bottom
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }

    NavigationDrawer {
        id: nav
        width: window.width * .75
        Rectangle {
            anchors.fill: parent
            color: "white"

            ListView {
                anchors.fill: parent

                delegate: Item {
                    height: dp(48)
                    anchors.left: parent.left
                    anchors.right: parent.right

                    Rectangle {
                        anchors.fill: parent
                        anchors.margins: dp(5)
                        color: "whitesmoke"

                        Text {
                            text: model.display
                            anchors.fill: parent
                            font.pixelSize: dp(20)

                            renderType: Text.NativeRendering
                            horizontalAlignment: Text.AlignHCenter
                            verticalAlignment: Text.AlignVCenter
                        }

                        MouseArea {
                            anchors.fill: parent
                            onClicked: {
                                label.text = index + " : " + model.display
                                nav.hide()
                            }
                        }
                    }
                }

                model: entry_model
            }
        }
    }
}
导入QtQuick 2.12
导入QtQuick.Controls 2.12
导入QtQuick.Layouts 1.12
导入QtQuick.Window 2.12
长方形{
id:窗口
宽度:360
身高:520
颜色:“00000000”
只读属性int dpi:Screen.pixelDensity*25.4
函数dp(x){返回(dpi<120)?x:x*(dpi/160);}
//应用程序栏
长方形{
id:menuRect
anchors.top:parent.top
anchors.left:parent.left
anchors.right:父项.right
高度:dp(48)
颜色:“4cd964”
//图标汉堡
长方形{
anchors.top:parent.top
.bottom:parent.bottom
anchors.left:parent.left
宽度:dp(48)
颜色:“4cd964”
长方形{
anchors.top:parent.top
锚。上边缘:dp(16)
anchors.left:parent.left
锚。左边缘:dp(14)
宽度:dp(20)
高度:dp(2)
}
长方形{
anchors.top:parent.top
锚。上边缘:dp(23)
anchors.left:parent.left
锚。左边缘:dp(14)
宽度:dp(20)
高度:dp(2)
}
长方形{
anchors.top:parent.top
锚。上边缘:dp(30)
anchors.left:parent.left
锚。左边缘:dp(14)
宽度:dp(20)
高度:dp(2)
}
鼠耳{
锚定。填充:父级
再次点击:{
nav.toggle()
}
}
}
}
标签{
id:标签
anchors.top:菜单ct.bottom
anchors.left:parent.left
anchors.right:父项.right
.bottom:parent.bottom
水平对齐:Text.AlignHCenter
垂直对齐:Text.AlignVCenter
}
导航抽屉{
id:nav
宽度:window.width*.75
长方形{
锚定。填充:父级
颜色:“白色”
列表视图{
锚定。填充:父级
代表:议程项目{
高度:dp(48)
anchors.left:parent.left
anchors.right:父项.right
长方形{
锚定。填充:父级
5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2