第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

無法從 python 引用現(xiàn)有 QML 元素

無法從 python 引用現(xiàn)有 QML 元素

MYYA 2023-12-29 10:21:06
我不會從 python 動態(tài)創(chuàng)建元素,我只是想訪問 qml 文件中已聲明的現(xiàn)有元素。我使用 findChild 來獲取 QObject 引用并連接到信號。這工作正常,但是當(dāng)我嘗試更具體并獲取像 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貢獻(xiàn)1805條經(jīng)驗 獲得超10個贊

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


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"

   }

}


查看完整回答
反對 回復(fù) 2023-12-29
  • 1 回答
  • 0 關(guān)注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號