2017-10-20 11 views
0

TextField의 값을 String에 전달하려고했는데 원본이 정확하다고 생각하지만 TextField에 "value"를 삽입하고 버튼을 클릭하면 아무 것도 반환하지 않습니다. 그러나이 값을 설정하면 TextField {Text : "Example"}의 값 : 반환 값 : "예", 어떤 아이디어입니까?QString이 TextField의 값을 가져 오지 않는 이유는 무엇입니까?

FirstPage.qml

Item { 

Rectangle { 
    anchors.fill: parent 

    ColumnLayout { 
     id: layoutLogin 
     anchors.centerIn: parent 
     anchors.margins: 3 
     spacing: 3 

     TextField { 
      objectName: "login" 
      Layout.fillWidth: true 
      placeholderText: "Username" 
     } 

     TextField { 
      property string password: text 
      objectName: "passwordd" 
      Layout.fillWidth: true 
      placeholderText: "Password" 
      echoMode: TextInput.Password 
     } 

     Button { 
      id: proccessButton 
      text: "Login" 
      Layout.fillWidth: true 
      onClicked: Login.test() 
     } 
     } 
    } 
} 

login.cpp :

Login::Login() { 
QQuickView view; 
view.setSource(QUrl(QStringLiteral("qrc:/FirstPage.qml"))); 
QObject *object = view.rootObject(); 
QObject *login = object->findChild<QObject*>("login"); 
QObject *password = object->findChild<QObject*>("password"); 
login_u = login->property("login").toString(); 
password_u = password->property("password").toString();} 

void Login::test(){ 
    qDebug() << "user:" << login_u; 
    qDebug() << "password" << password_u; 
} 

출력 내가 "버튼"을 클릭 할 때 :

user: "" 
password "" 
+1

어디에서 트리거하나요? 값을 검색하는'Login' 생성자? 'test()'액션에서 그렇게해야하지 않습니까? – user0042

+0

재현 가능한 코드를 배치 할 수 있으므로 중요한 일부 세부 정보가 제거되었습니다. – eyllanesc

+0

나는 @ user0042, 같은 결과를 시도합니다. –

답변

1

여기했습니다.

첫 번째 작업은 아래와 같이 QObject에서 상속하는 클래스를 구현하고 사용자 이름과 암호 속성을 처리하는 것입니다 : 우리가 Q_PROPERTY 매크로를 사용하여 속성을 노출해야이 클래스에서

, 우리는 기능을 원하는 경우 QML에서 호출하려면 앞에 Q_INVOKABLE이 와야합니다. 우리는 QML가 qmlRegisterType를 사용하여 다음에 등록 그런

#ifndef LOGIN_H 
#define LOGIN_H 

#include <QObject> 

#include <QDebug> 

class Login : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString username READ username WRITE setUsername NOTIFY usernameChanged) 
    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) 
public: 
    explicit Login(QObject *parent = nullptr):QObject(parent){ 

    } 
    Q_INVOKABLE void test(){ 
     qDebug()<<mUsername<<mPassword; 
    } 

    QString username() const{ 
     return mUsername; 
    } 

    void setUsername(const QString &username){ 
     if(mUsername == username) 
      return; 
     mUsername = username; 
     emit usernameChanged(mUsername); 
    } 


    QString password() const{ 
     return mPassword; 
    } 

    void setPassword(const QString &password) 
    { 
     if(mPassword == password) 
      return; 
     mPassword = password; 
     emit passwordChanged(mPassword); 
    } 

signals: 
    void usernameChanged(QString username); 
    void passwordChanged(QString password); 
private: 
    QString mUsername; 
    QString mPassword; 
}; 


#endif // LOGIN_H 

그래서 지금은 QML 라이브러리

#include "login.h" 

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    qmlRegisterType<Login>("com.examples.login", 1, 0, "Login"); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    if (engine.rootObjects().isEmpty()) 
     return -1; 

    return app.exec(); 
} 

입니다 그리고 결국 우리는 해당 연결

import QtQuick 2.6 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 
import QtQuick.Layouts 1.3 
import com.examples.login 1.0 

Window { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Login") 

    Login{ 
     id: login 
     username: usernameField.text 
     password: passwordField.text   
    } 

    Rectangle { 
     anchors.fill: parent 

     ColumnLayout { 
      id: layoutLogin 
      anchors.centerIn: parent 
      anchors.margins: 3 
      spacing: 3 

      TextField { 
       id: usernameField 
       textColor: "black" 
       Layout.fillWidth: true 
       placeholderText: "Username" 
      } 

      TextField { 
       id: passwordField 
       Layout.fillWidth: true 
       placeholderText: "Password" 
       echoMode: TextInput.Password 
       textColor: "black" 
      } 

      Button { 
       id: proccessButton 
       text: "Login" 
       Layout.fillWidth: true 
       onClicked: login.test() 

      } 
     } 
    } 
} 
을 할당하기 QML 측에서이를 사용

전체 예제는 다음에서 찾을 수 있습니다. link

+0

그게 도움이 될 수있어, 정말 고마워 !! 담당자 + –

0

나는 속성 이름 텍스트이 될 것으로 판단 . 이 시도 : 난 당신이 로그인 클래스의 생성자에서 값을 받고 있는지 깨달았다

login_u = login->property("text").toString(); 
password_u = password->property("text").toString(); 

. test() 호출시 얻어야합니다.

void Login::test() 
{ 
    QQuickItem *object = m_view->rootObject(); 
    QObject *login = object->findChild<QObject*>("login"); 
    QObject *password = object->findChild<QObject*>("password"); 
    login_u = login->property("text").toString(); 
    password_u = password->property("text").toString(); 

    qDebug() << "user:" << login_u; 
    qDebug() << "password" << password_u; 
} 

그것은 내 대답은 제대로 C++에서 QML 데이터를 얻는 방법이다 배경 문제를 해결하기 위해 노력하고 좀 더 깊이 갈 것입니다

+0

나는 이미 처음 시도 했었고 동일했습니다. 결과. –