C++ 为什么我的QString不能获取TextField的值?
我试图将TextField的值传递给字符串,我相信源代码是正确的,但是当我将值插入TextField并单击按钮时,它不会返回任何结果,但是如果我在 TextField{Text:Example},它返回:Example,有什么想法吗 FirstPage.qmlC++ 为什么我的QString不能获取TextField的值?,c++,qt,qml,qt5,qobject,C++,Qt,Qml,Qt5,Qobject,我试图将TextField的值传递给字符串,我相信源代码是正确的,但是当我将值插入TextField并单击按钮时,它不会返回任何结果,但是如果我在 TextField{Text:Example},它返回:Example,有什么想法吗 FirstPage.qml Item { Rectangle { anchors.fill: parent ColumnLayout { id: layoutLogin anchors.centerIn: pare
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;
}
我认为财产名称应该是文本。 试试这个:
login_u = login->property("text").toString();
password_u = password->property("text").toString();
我意识到您正在登录类的构造函数中获取值。
应在调用测试时获取
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数据 第一个任务是实现一个从QObject继承的类,并处理用户名和密码属性,如下所示: 在这个类中,我们必须使用Q_PROPERTY宏公开属性,如果我们希望从QML调用函数,那么它前面必须有Q_INVOKABLE
完整的示例可以在下面的中找到,您在哪里触发登录构造函数来检索值?这不应该在测试操作中进行吗?您可以放置一个可复制的代码,您已经消除了一些重要的细节。我尝试@user0042,结果相同。@Césaraugus尝试您的解决方案,如果您有任何问题,请告诉我,以便我可以帮助您输入密码字段。objectName:objectName:passwordd中有一个输入错误
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;
}
#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
#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()
}
}
}
}