亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法從 python 引用現有 QML 元素

無法從 python 引用現有 QML 元素

MYYA 2023-12-29 10:21:06
我不會從 python 動態創建元素,我只是想訪問 qml 文件中已聲明的現有元素。我使用 findChild 來獲取 QObject 引用并連接到信號。這工作正常,但是當我嘗試更具體并獲取像 QComboBox 這樣的小部件(不是 QObject)時,我總是得到 None。我是否遺漏了一些東西或者 findChild 不適合與小部件一起使用?這是我的簡單 qml 代碼:Window {    visible:true    width:600    height:400    Button {        id: clickMe        objectName: "clickMe"        x: 244        y: 263        text: qsTr("click me!")    }   ComboBox {       id: comboBox       objectName: "comboBox"       x: 199       y: 157       width: 200   }}這是我的Python代碼:# qt importsfrom PyQt5.QtQml import QQmlApplicationEnginefrom PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QMessageBoxfrom PyQt5.QtWidgets import QComboBox, QPushButtonfrom PyQt5 import QtWidgets, QtGuifrom PyQt5.QtGui import QIconfrom PyQt5.QtCore import QObjectapp = QApplication(sys.argv)engine = QQmlApplicationEngine()engine.load('main.qml')win = engine.rootObjects()[0]win.show()# this does work because it is QObject:clickMe = win.findChild(QObject, "clickMe")clickMe.clicked.connect(Foo)# this does not work, I get None so can't add items to the combobox:comboBox = win.findChild(QComboBox, "comboBox")comboBox.addItem("a")sys.exit(app.exec_())
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

首先,QML Item Combobox 不是 QtWidgets QComboBox,因此您不應該使用該類進行過濾,這就是您的嘗試失敗的原因。從 python(或 C++)訪問 QML 元素也是不好的做法,因為生命周期不受管理(例如,可以刪除并重新創建相同“id”的對象而不通知),相反,您必須創建允許交換信息的 QObject ,例如對于 QComboBox,您可以創建一個模型:


main.py


import os

import sys


# qt imports

from PyQt5.QtCore import pyqtProperty, pyqtSlot, QObject, QUrl

from PyQt5.QtGui import QGuiApplication, QStandardItem, QStandardItemModel

from PyQt5.QtQml import QQmlApplicationEngine


CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))



class Manager(QObject):

    def __init__(self, parent=None):

        super().__init__(parent)

        self._model = QStandardItemModel()


    @pyqtProperty(QObject, constant=True)

    def model(self):

        return self._model


    @pyqtSlot()

    def foo(self):

        print("clicked")



def main():

    app = QGuiApplication(sys.argv)


    manager = Manager()


    engine = QQmlApplicationEngine()

    engine.rootContext().setContextProperty("manager", manager)


    filename = os.path.join(CURRENT_DIR, "main.qml")


    engine.load(QUrl.fromLocalFile(filename))


    item = QStandardItem("a")

    manager.model.appendRow(item)


    sys.exit(app.exec_())



if __name__ == "__main__":

    main()

主.qml


import QtQuick.Window 2.15

import QtQuick.Controls 2.15



Window {

    visible:true

    width:600

    height:400


    Button {

        id: clickMe

        x: 244

        y: 263

        text: qsTr("click me!")

        onClicked: manager.foo()

    }

   ComboBox {

       id: comboBox

       x: 199

       y: 157

       width: 200

       model: manager.model

       textRole: "display"

   }

}


查看完整回答
反對 回復 2023-12-29
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號