从C ++中获取QML Editbox的价值

时间:2014-03-26 10:45:53

标签: c++ qt qml qtquick2 qt-quick

我用QML中的一些文本框创建了一个QtQuick应用程序。我想在我的c ++代码中使用这些文本框的值。那么如何从C ++代码中获取这些值?

2 个答案:

答案 0 :(得分: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)));

答案 1 :(得分:2)

我相信你有一些C ++类用作数据容器。您正在将QML用于UI目的。用户通过QML UI输入的数据必须存储在C ++容器中。

有两种方法可以实现它。

1)使用setContextProperty()方法

在C ++中创建和管理对象并将对象公开给QML

2)用C ++创建一个类,并使用qmlRegisterType函数将该类注册为QML类,然后在QML端管理对象

此示例包含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类型。您还可以创建Employee的C ++对象,并使用setContextProperty将其设置为上下文属性,然后编辑该paritcular对象。选择是你的。