如何从C ++代码从QML的TextField检索文本?

插口

我正在尝试检索在TextField中键入的用户输入文本值,但是QML找不到我的对象,当我键入某些内容时,以下关于Qt Creator应用程序输出的错误文件

ReferenceError:未定义foo

我想念什么?注意:欢迎使用任何更好的方法。我刚刚开始学习QML。

这是代码:

main.cpp

int main(int argc, char *argv[])
{
    //qRegisterMetaType<NameUserInput>(NAMEOF(NameUserInput));
    //qRegisterMetaType<NameUserInput*>(NAMEOF(NameUserInput*));
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    NameUserInput nameUserInput;
    QQmlApplicationEngine engine;
    engine.rootContext()->setProperty("foo", //&nameUserInput);
                                     QVariant::fromValue(&nameUserInput));
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);
    return app.exec();
}

NameUserInput.h

class NameUserInput : public QObject
{
    Q_OBJECT
public:
    explicit NameUserInput(QObject *parent = nullptr);
    //NameUserInput(const NameUserInput &other);
    NameUserInput(const QString &text);
    ~NameUserInput() override = default;
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
    QString text() const;
    void setText(const QString &text);
signals:
    void textChanged(const QString &text);
private:
    QString mText;
};

Q_DECLARE_METATYPE(NameUserInput*)

main.qml

    import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.5
import QtQuick.Controls.Styles 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("This is my application title!")

    ColumnLayout
    {
        id: col1
        spacing: 2

        Rectangle
        {
            width: 100
            Layout.preferredWidth: 40
            Layout.preferredHeight: 40
            Layout.alignment: Qt.AlignLeft
            Text {
                font.pointSize: 20
                id: label1
                text: qsTr("Your name:")
            }
        }

        Rectangle
        {
            width: 320
            Layout.preferredWidth: 40
            Layout.preferredHeight: 40
            Layout.alignment: Qt.AlignLeft
            TextField {
                placeholderText: "this is the default text"
                font.pointSize: 20
                //text: "this is my text"
                id: textEdit1
                onTextChanged: foo.text = text
                background: Rectangle {
                    border.color: "blue"
                    border.width: 3
                    radius: 12
                }
            }
        }

        Rectangle
        {
            width: 100
            Layout.preferredWidth: 40
            Layout.preferredHeight: 40
            Layout.alignment: Qt.AlignLeft
            Button
            {
                text: "Hit me!"
                onClicked: console.log("user input:" + textEdit1.text)
            }
        }
    }
}
永乐

如果要导出QObject,则应使用setContextProperty()而不是setProperty()同样也不必使用QVariant。

engine.rootContext()->setContextProperty("foo", &nameUserInput);

另一方面,没有必要使用Q_DECLARE_METATYPE,将Q_PROPERTY放在私有部分是一个好习惯:

#ifndef NAMEUSERINPUT_H
#define NAMEUSERINPUT_H

#include <QObject>

class NameUserInput : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
public:
    explicit NameUserInput(QObject *parent = nullptr);
    NameUserInput(const QString &text);
    ~NameUserInput() override = default;
    QString text() const;
    void setText(const QString &text);
signals:
    void textChanged(const QString &text);
private:
    QString mText;
};


#endif // NAMEUSERINPUT_H

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

QML TextField如何大写文本

来自分类Dev

如何使用C ++更新QML文本

来自分类Dev

QML-如何从列表视图内的文本编辑中检索信息

来自分类Dev

如何从JSON检索文本

来自分类Dev

如何在C代码或C ++代码中显示此类文本?

来自分类Dev

如何在C ++中获取QML方法的源代码?

来自分类Dev

QML:如何检索默认字体对象?

来自分类Dev

如何从xml中检索文本

来自分类Dev

如何从文本中检索值

来自分类Dev

如何将 func for textfield 下划线代码应用于所有文本字段

来自分类Dev

如何通过代码检索Stripe Promo代码

来自分类Dev

如何将ID动态添加到文本框并在Webforms中的代码后面检索

来自分类Dev

c# 如何从网站复制文本(不是源代码)

来自分类Dev

如何压缩C ++代码?

来自分类Dev

C 代码是如何运行的?

来自分类Dev

如何在C#中的特定点之后从文本框中检索文本?

来自分类Dev

如何在C#中的特定点之后从文本框中检索文本?

来自分类Dev

如何从QML访问C ++枚举?

来自分类Dev

如何从C ++设置QML属性

来自分类Dev

如何从QML访问C ++枚举?

来自分类Dev

如何从C ++调用QML方法?

来自分类Dev

如何在TextField中设置文本填充?

来自分类Dev

如何通过TextField输入显示文本?

来自分类Dev

如何在TextField中设置文本填充?

来自分类Dev

Ubuntu SDK QML如何更改TextField的背景颜色

来自分类Dev

如何在 QML 的 gridview 顶部添加文本?

来自分类Dev

从C ++代码创建单独的QML窗口

来自分类Dev

检索选定文本的html代码

来自分类Dev

qml 从 C++ 设置文本属性