2017-10-20 98 views
0

我試圖將TextField的值傳遞給String,我相信Source是正確的,但是當我將「value」插入到TextField中並單擊該按鈕時,它將不返回任何內容,但如果我設置了該值值在 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

我的回答會去得更深一些試圖解決的背景問題,就是如何正確地得到C++的QML數據。

的首要任務是實現從QObject繼承的類和處理的用戶名和密碼屬性如下圖所示:

在這個類中,我們必須使用Q_PROPERTY宏暴露的屬性,如果我們想要一個功能要從QML調用,則必須在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 

然後我們接下來的註冊它使用qmlRegisterType QML來所以現在這是一個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(); 
} 

而在最後,我們使用他們的QML側分配相應的連接

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

      } 
     } 
    } 
} 

完整的示例可在以下找到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; 
} 

它在這裏工作

+0

我已經第一次嘗試了這個結果。 –

相關問題