Использование файлов классов Python в QML - PullRequest
0 голосов
/ 28 марта 2019

У меня есть main.qml файл, который выглядит как показано ниже

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5


ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    TextField {
        id:textarea
        anchors.centerIn: parent
        Button {
            text: "Click Me"
            anchors.leftMargin: 34
            id:textareabutton
            y: 0
            anchors.left:textarea.right
            onClicked: {
                someclass.say(textarea.text)
            }
        }
    }
    TextField {
        id:textarea2
        anchors.horizontalCenterOffset: 0
        anchors.topMargin: 37
        anchors.top: textarea.bottom
        anchors.horizontalCenter: textarea.horizontalCenter
    }
    Connections {
        target: someclass

        onToPython : {
            textarea2.text = say
        }
    }
}

У меня есть файл класса Python, который я добавил с помощью опции добавления файла в qtcreator, когда я запускаю main.qml Я получаю ошибки, связанные с неопределенностью классов, как показано ниже

qrc:/main.qml:33:5: QML Connections: Cannot assign to non-existent property "onToPython"
qrc:/main.qml:34: ReferenceError: someclass is not defined
qrc:/main.qml:22: ReferenceError: someclass is not defined

У меня настроен external tools в Qt создателе для python, и когда я запускаю его, он работает. Однако это не работает, когда я запускаю main.qml. Что мне не хватает, как я могу использовать файл класса Python.

ниже приведен файл python, который вызывает QML, если я запускаю из python, он работает, я хочу запустить файл qml и вызвать этот класс

import sys
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject,pyqtSignal,pyqtSlot

class someclassr(QObject):
    def __init__(self):
        QObject.__init__(self)

    toPython=pyqtSignal(str, arguments=["say"])
    @pyqtSlot(str)
    def say (self,name):
        word= "hi " + name
        self.toPython.emit(word)


app = QGuiApplication(sys.argv)
engine=QQmlApplicationEngine()
classloader=someclassr()
engine.rootContext().setContextProperty('someclass',classloader)
engine.load('main.qml')
engine.quit.connect(app.quit)
sys.exit(app.exec_())

1 Ответ

1 голос
/ 28 марта 2019

Краткий ответ: нет встроенной интеграции между QML и Python. Я не уверен, почему можно предположить, что это было, но на самом деле это не так. Qt Creator - это многоязычная IDE, и его поддержка Python не подразумевает интеграции QML и Python.

Сказав это, классы Python могут быть легко интегрированы с Qt и QML с использованием PyQt . Если вы не хотите зависеть от PyQt, вы можете интегрировать их вручную, написав классы адаптера, которые вызывают в среде исполнения Python, с которой ваше приложение будет связывать.

...