2017-10-20 9 views
0

Ich versuche, den Wert des TextField an einen String übergeben, ich glaube, die Quelle ist korrekt, aber wenn ich den "Wert" in das TextField einfügen und klicken Sie auf die Schaltfläche, gibt nichts zurück, aber wenn ich dies festlegen Wert in TextField {Text: "Beispiel"}, es gibt zurück: "Beispiel", irgendwelche Ideen?Warum erhält mein QString nicht den Wert des TextFields?

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; 
} 

Ausgang, wenn ich in der "Button" klicken:

user: "" 
password "" 
+1

Wo triggern Sie der 'Login'-Konstruktor, um die Werte abzurufen? Sollte das nicht in der 'test()' Aktion gemacht werden? – user0042

+0

Sie können einen reproduzierbaren Code platzieren, Sie haben einige wichtige Details eliminiert. – eyllanesc

+0

Ich versuche @ User0042, das gleiche Ergebnis. –

Antwort

1

Meine Antwort ein wenig tiefer gehen wird versucht, das Hintergrundproblem zu lösen, das ist, wie die QML Daten von C++ richtig zu erhalten.

Die erste Aufgabe ist es, eine Klasse zu implementieren, die die Benutzernamen und Passwort Eigenschaften von QObject und Griff erbt wie unten dargestellt:

In dieser Klasse wir die Eigenschaften der Q_PROPERTY Makro aussetzen müssen, und wenn wir wollen, eine Funktion Um von QML aufgerufen zu werden, muss Q_INVOKABLE vorangestellt werden.

#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 

Dann registrieren wir es neben QML qmlRegisterType mit so jetzt ist dies eine QML Bibliothek

#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(); 
} 

Und am Ende nutzen wir sie auf der qml Seite die entsprechenden Verbindungen zuweisen

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() 

      } 
     } 
    } 
} 

Das vollständige Beispiel finden Sie unter link

+0

das kann mir helfen, vielen Dank !! Rep + –

0

ich die Eigenschaft Name glauben Text sein sollte . Try this:

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

erkannte ich, dass Sie die Werte in den Konstruktor der Login-Klasse bekommen. Es sollte zum Zeitpunkt des Aufrufs von test() erhalten werden.

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; 
} 

Es funktionierte hier

+0

Ich habe dies bereits beim ersten Mal und gleich versucht Ergebnis. –

Verwandte Themen