2017-10-20 28 views
0

J'essaie de passer la valeur de TextField à une chaîne, je crois que la source est correcte, mais quand j'insère la "valeur" dans le TextField et cliquez sur le bouton, il ne retourne rien, mais si je mets cette value in TextField {Text: "Exemple"}, il retourne: "Exemple", des idées?Pourquoi ma chaîne QString n'a-t-elle pas la valeur de 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; 
} 

sortie lorsque je clique dans le "Button":

user: "" 
password "" 
+1

Où déclenchez-vous? le constructeur 'Login', pour récupérer les valeurs? Cela ne devrait-il pas être fait dans l'action 'test()'? – user0042

+0

Vous pouvez placer un code reproductible, vous avez éliminé certains détails importants. – eyllanesc

+0

j'essaie @ user0042, même résultat. –

Répondre

1

Ma réponse sera un peu plus essayer de résoudre le problème de fond qui est de savoir comment obtenir correctement les données QML de C++.

La première tâche consiste à implémenter une classe qui hérite de QObject et de gérer les propriétés nom d'utilisateur et mot de passe ci-dessous:

Dans cette classe, nous devons exposer les propriétés à l'aide de la Q_PROPERTY macro, et si nous voulons une fonction Pour être appelé à partir de QML, il doit être précédé de Q_INVOKABLE.

#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 

Ensuite, nous enregistrons à côté de QML en utilisant qmlRegisterType maintenant c'est une bibliothèque 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(); 
} 

Et à la fin, nous les utiliser sur le côté QML attribuer les connexions correspondantes

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

      } 
     } 
    } 
} 

L'exemple complet peut être trouvé à l'adresse suivante: link

+0

qui peut m'aider, merci beaucoup !! Rep + –

0

Je crois que le nom de la propriété doit être texte . Essayez ceci:

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

j'ai réalisé que vous obtenez les valeurs dans le constructeur de la classe de connexion. Il doit être obtenu au moment de l'appel d'essai().

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

Il a travaillé ici

+0

J'ai déjà essayé la première fois et même résultat. –