Python 如何将PyQt中的动态菜单项添加到QML抽屉中
我目前在将PyQt中的动态菜单项添加到QML抽屉中的QAbstractListModel时遇到了一些问题 在以下链接中可以找到我正在使用的相应QML文件:和 drawer.py: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
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