为什么我的QString没有得到文本字段的值
Why does not my QString get the value of the TextField?
我正在尝试将文本字段的值传递给字符串,我相信源是正确的,但是当我将"值"插入文本字段并单击按钮时,它什么也没返回,但是如果我在文本字段{文本:"示例"},它返回:"示例",有什么想法吗?
首页.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()
}
}
}
}
完整的示例可以在以下链接中找到
我相信
属性名称应该是文本。试试这个:
login_u = login->property("text").toString();
password_u = password->property("text").toString();
我意识到您正在获取 Login 类的构造函数中的值。它应该在调用 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;
}
它在这里工作
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 协议缓冲区字符串字段的文本编码
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- 在特定字段中关键字搜索后,从文本文件中提取多个记录
- 在文本文件中搜索字段名称,并将所有后续行返回到控制台 - C++
- 解析文本文件时,同一字段具有 1 或 2 个名称
- 如何在解析文本格式的 protobuf 消息时忽略错误的字段
- 在c++文本文件中读取多个字段
- 用户界面-Adobe Adam and Eve,C++:如何创建可点击按钮、轨迹栏、文本输入字段和图像