Передача данных из QML в Python

Oda412

Новичок
Пользователь
Июн 1, 2021
4
0
1
Здравствуйте!
Вчера задавала вопрос о передаче данных из Python в QML https://itfy.org/threads/obmen-dannymi-mezhdu-python-i-qml.2381/
Теперь интересует вопрос о передаче денных в обратном направлении:
Есть форма с текстовым полем "Введите имя сотрудника"
Безымянный.png
Необходимо, чтобы после нажатия на кнопку "Click on me" значение из поля "Введите имя сотрудника" передалось в Python в переменную a, чтобы сработала команда print(a)

Как можно решить эту задачу?

Код Python:
Python:
import sys
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject,pyqtSignal,pyqtSlot

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

sumResult=pyqtSignal(int,arguments=['sum'])

@pyqtSlot(int)
def sum(self,arg1):
    self.sumResult.emit(arg1)

if __name__ == '__main__':

    app = QGuiApplication(sys.argv)
    engine=QQmlApplicationEngine()
    engine.load('main.qml')
    engine.quit.connect(app.quit)
    sys.exit(app.exec_())

Код QML:
Код:
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("QML test. v1")


    Rectangle {
        id: mainRect
        anchors.centerIn: parent
        width: 400
        height: 200
        border.color: "LightGray"

        ColumnLayout {
            anchors.fill: parent
            spacing: 10

            RowLayout {
                //anchors.fill: parent
                Layout.alignment: Qt.AlignCenter
                //Layout.preferredWidth: 200
                Layout.preferredHeight: 20
                spacing: 6

                Button {
                    id: buttonClickMe
                    Layout.leftMargin: 10
                    text: "Click on me"

                    onClicked: {
                        /// Если в полне что-то введено, то
                        if (txtFild.text.length != 0 ) {
                            labelPersonFIO.text = txtFild.text;  
                            console.log("text: ", txtFild.text);  
                        }
                        else {
                            labelPersonFIO.text = "Сотрудник не выбран";
                        }

                    }
                }

                TextField {
                    id: txtFild
                    placeholderText: "Введите имя сотрудника"
                    font.pixelSize: 16
                }
            }

            Item {
                    Layout.alignment: Qt.AlignCenter | Qt.AlignTop
                    Layout.preferredWidth: 300
                    Layout.preferredHeight: 40
                    Label {
                        id: labelPersonFIO
                        anchors.centerIn: parent
                        font.pixelSize: 20
                        color: "Gray"
                        text: "Сотрудник не выбран"
                    }
                }

        }

    }
}
 

Вложения

  • Безымянный.png
    Безымянный.png
    12 КБ · Просмотры: 0

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Необходимо, чтобы после нажатия на кнопку "Click on me" значение из поля "Введите имя сотрудника" передалось в Python в переменную a, чтобы сработала команда print(a)
Вот пример:
Python:
import sys
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSlot


class Test1(QObject):
    a = ''

    @pyqtSlot(str)
    def printText(self, text):
        # записываем значение из текстового поля в переменную a
        self.a = text
        print('Значение из текстового поля:', self.a)


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    # контекст
    ctx = engine.rootContext()
    # экземпляр класса
    ctxVar = Test1()
    # добавляем в контекст
    engine.rootContext().setContextProperty("test", ctxVar)
    engine.load('main.qml')
    engine.quit.connect(app.quit)
    sys.exit(app.exec_())
Код:
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("QML test. v1")


    Rectangle {
        id: mainRect
        anchors.centerIn: parent
        width: 400
        height: 200
        border.color: "LightGray"

        ColumnLayout {
            anchors.fill: parent
            spacing: 10

            RowLayout {
                //anchors.fill: parent
                Layout.alignment: Qt.AlignCenter
                //Layout.preferredWidth: 200
                Layout.preferredHeight: 20
                spacing: 6

                Button {
                    id: buttonClickMe
                    Layout.leftMargin: 10
                    text: "Click on me"

                    onClicked: {
                        /// Если в поле что-то введено, то
                        if (txtFild.text.length != 0 ) {
                            labelPersonFIO.text = txtFild.text; 
                            console.log("text: ", txtFild.text);
                            // передаем значение из поля в метод объекта Test1
                            test.printText(txtFild.text)
                        }
                        else {
                            labelPersonFIO.text = "Сотрудник не выбран";
                        }

                    }
                }

                TextField {
                    id: txtFild
                    placeholderText: "Введите имя сотрудника"
                    font.pixelSize: 16
                }
            }

            Item {
                    Layout.alignment: Qt.AlignCenter | Qt.AlignTop
                    Layout.preferredWidth: 300
                    Layout.preferredHeight: 40
                    Label {
                        id: labelPersonFIO
                        anchors.centerIn: parent
                        font.pixelSize: 20
                        color: "Gray"
                        text: "Сотрудник не выбран"
                    }
                }

        }

    }
}
 

Oda412

Новичок
Пользователь
Июн 1, 2021
4
0
1
stud_55, здравствуйте! Спасибо большое за помощь, все работает. Теперь механизм понятен
Только сейчас увидела, что в исходном коде не убрала лишние строки из кода python... Спасибо, что все откорректировали
 

Форум IT Специалистов