2014-03-26 1 views
2

Я создал приложение QtQuick с некоторыми текстовыми полями в QML. Я хочу использовать значение этих текстовых полей в моем коде на C++. Итак, как я могу получить эти значения из кода на C++?Получите значение QML Editbox из C++

ответ

4

Это может быть как:

QML файл:

Item{ 
id: root 

signal textChanged(string msg) 

TextInput 
{ 
    id: inputText 
    anchors.horizontalCenter: root.horizontalCenter 
    anchors.verticalCenter: root.verticalCenter 

    text : "" 
    inputMethodHints: Qt.ImhNoPredictiveText 
    selectByMouse: true 

    onAccepted: { 
     inputText.focus = false; 
     Qt.inputMethod.hide(); 
     root.textChanged(inputText.text); 
    } 

} 
} 

Вы можете подключить сигнал вашего QML в какой-то слот в CPP как:

QObject::connect((QObject *)viewer.rootObject(), SIGNAL(textChanged(QString)), this, SLOT(someSlot(QString))); 
2

Я считаю, что у вас есть некоторые C++, который используется как контейнер данных. Вы используете QML для целей пользовательского интерфейса. Независимо от того, какие данные пользователь вводит через QML-интерфейс, необходимо сохранить в контейнере C++.

Существует 2 способа его достижения.

1) Создание и управление объектами в C++ и подвергать объекты в QML с помощью setContextProperty() метод

2) Создать класс в C++ и зарегистрировать этот класс в качестве типа QML, которые будут использоваться в QML стороне, используя qmlRegisterType функцию и затем управлять объектами со стороны QML. itselft

Этот пример содержит класс Customer, который имеет простой класс Employee и одно имя члена данных. Этот пример демонстрирует оба способа, как описано выше.

заголовочный файл employee.h

#ifndef EMPLOYEE_H 
#define EMPLOYEE_H 

#include <QObject> 

class Employee : public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) 
public: 
    explicit Employee(QObject *parent = 0); 
    QString name(); 
    void setName(const QString &name); 
signals: 
    void nameChanged(); 
public slots: 

private: 
    QString m_name; 

}; 

employee.cpp файл

#include "employee.h" 
#include <QDebug> 
Employee::Employee(QObject *parent) : 
    QObject(parent) 
{ 
} 

QString Employee::name() 
{ 
    return m_name; 
} 

void Employee::setName(const QString &name) 
{ 
    if(m_name!=name) 
    { 
     m_name=name; 
     emit nameChanged(); 
     qDebug()<<"C++:Name changed->"<<m_name; 
    } 
} 

main.cpp файл

#include <QtGui/QGuiApplication> 
#include "qtquick2applicationviewer.h" 
#include <employee.h> 
#include <QQmlEngine> 
#include <QQmlContext> 
#include <QtQml> 
int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QtQuick2ApplicationViewer viewer; 
    Employee emp; 
    viewer.rootContext()->setContextProperty("employee",&emp); 
    qmlRegisterType<Employee>("CPP.Mycomponents",1,0,"Employee"); 
    viewer.setMainQmlFile(QStringLiteral("qml/SO_GetValueOfQMLEditboxFromCpp/main.qml")); 
    viewer.showExpanded(); 

    return app.exec(); 
} 

//main.qml

import QtQuick 2.0 
import CPP.Mycomponents 1.0 
Rectangle { 
    width: 360 
    height: 360 
    Rectangle{ 
     id:rect1 
     width:360 
     height:50 
     color:"transparent" 
     border.color: "black" 
    TextInput{ 
     id:contextPropertyInput 
     anchors.left: parent.left 
     anchors.leftMargin: 5 
     width:350 
     height:50 
     color:"black" 
     font.pixelSize: 16 
     onTextChanged: employee.name = text 

    } 
    } 
    Rectangle{ 
     width:360 
     height:50 
     color:"transparent" 
     border.color: "black" 
     anchors.top: rect1.bottom 
     anchors.topMargin: 10 
     TextInput{ 
      id:customQMLTypeInput 
      anchors.left: parent.left 
      anchors.leftMargin: 5 
      width:360 
      height:50 
      color:"black" 
      font.pixelSize: 16 
     } 
    } 
    Employee{ 
     id:qmlEmp; 
     name:customQMLTypeInput.text 
    } 
} 

Посмотрите, как Employee используется как тип QML. Вы также можете создать объект C++ из Employee и установить его как свойство контекста с помощью setContextProperty и отредактировать этот объект. Твой выбор.