为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 PyQt 中的动态菜单条目添加到 QML Drawer

如何将 PyQt 中的动态菜单条目添加到 QML Drawer

慕神8447489 2022-07-26 16:18:31
我目前在将动态菜单条目从 PyQt 添加到 QML Drawer 内的 QAbstractListModel 时遇到了一些麻烦。在以下链接中可以找到我正在使用的相应 QML 文件:main.qml和NavigationDrawer.qmldrawer.py:class QDrawer(QQuickView):    close_button_clicked = QtCore.pyqtSignal()    error_triggered = QtCore.pyqtSignal()    on_transparent_frame_clicked = QtCore.pyqtSignal()    def __init__(self, parent=None, layout=None, drawerMenuEntriesList=[], callback=None):        super().__init__()        self.parent =  parent        qmlRegisterType(QPythonBinding, "MyApplication", 1, 0, "QPythonBinding")        # Formatting of the QDrawer        self._format(QtGui.QColor(QtCore.Qt.transparent))        self._source_qml_file("main.qml")        self.setResizeMode(self.SizeRootObjectToView)        self.engine().rootContext().setContextProperty("QDrawer", self)        # Prevent from continuing if the QML file was not successfully sourced        if not self.engine().rootContext():            logger.error("No object could be loaded from sourced QML file and create a context out of it")            self.error_detected()        # Connections        self.statusChanged.connect(self.on_statusChanged)        self.transparent_frame = QWidget()        eventFilter_transparent_frame = _Filter(self.transparent_frame)        self.transparent_frame.installEventFilter(eventFilter_transparent_frame)        eventFilter_transparent_frame.released.connect(self.transparent_frame_clicked)        self._add_drawer_to_container_on_layout(layout)        # the callback function is propagated up to the ui_controller         self.populate(drawerMenuEntriesList, callback)        logger.debug(f"Drawer created")    ...    def populate(self, drawerMenuEntriesList, callback):        menu = self._get_qml_component_by_objectname(QtCore.QAbstractListModel, "drawer_list")        qpybinding = QPythonBinding()生成的抽屉如下所示:这个想法是用populate()函数中的“ drawerMenuEntriesList ”确定的任何自定义字符串条目替换抽屉菜单中的条目“Fragment X” 。
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

如果分析 QML 代码,只需要从 python 中创建一个模型(例如 QStandardItemModel),用 setContextProperty 将其导出到 QML 并在 ListView 中设置。


import sys


from PyQt5 import QtCore, QtGui, QtQuick



class QDrawer(QtQuick.QQuickView):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.setResizeMode(self.SizeRootObjectToView)

        self.entry_model = QtGui.QStandardItemModel()

        self.rootContext().setContextProperty("entry_model", self.entry_model)

        self.setSource(QtCore.QUrl.fromLocalFile("main.qml"))


    def addEntry(self, entry):

        it = QtGui.QStandardItem(entry)

        self.entry_model.appendRow(it)



def main():

    app = QtGui.QGuiApplication(sys.argv)

    w = QDrawer()

    for i in range(10):

        w.addEntry("entry-{}".format(i))

    w.show()

    sys.exit(app.exec_())



if __name__ == "__main__":

    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

            }

        }

    }

}

//img1.sycdn.imooc.com//62dfa39100012b7703600547.jpg

查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信