gpt4 book ai didi

c++ - 为什么我的 QString 没有得到 TextField 的值?

转载 作者:行者123 更新时间:2023-11-28 04:57:26 24 4
gpt4 key购买 nike

我试图将 TextField 的值传递给一个字符串,我相信 Source 是正确的,但是当我将“值”插入 TextField 并单击按钮时,它什么都不返回,但是如果我设置这个值在TextField {Text:"Example"},它返回:"Example",有什么想法吗?

第一页.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()
}
}
}
}

登录.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 ""

最佳答案

我的回答会更深入一些,试图解决背景问题,即如何从 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找到

关于c++ - 为什么我的 QString 没有得到 TextField 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46854262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com