从C ++ Qt 5.2.1更改QML文本框中的文本

时间:2014-02-20 21:18:48

标签: c++ qt qml

我对QML和C ++有点新意,但我学得很快。虽然我对某事感到有点难过。我正在尝试创建一个从QML TextInput文本字段读取文本的应用程序,并将数据写入文本区域。我不确定会出现什么问题,但在阅读文本后,我收到错误“无法将QQuickTextInput分配给QString” - 我对如何写回文本区域感到有点困惑。如果有人可以发光,那将是值得赞赏的。我已经通过了QML / C ++绑定页面,这似乎没有帮助。我想知道那个页面是否是为旧版本的Qt编写的......到目前为止,这是我的代码:

QML:

 import QtQuick 2.0
import QtMultimedia 5.0
import QtQuick.Controls 1.1
import QtQuick.Window 2.1
import QtWinExtras 1.0
import QtQuick.Layouts 1.1

Rectangle {
    id: main
    width: 640
    height: 480
    signal onClicked_button

    TextInput {
        id: textbocks
        objectName: textbocks
        x: 280
        y: 230
        width: 80
        height: 20
        text: "Text Input"
        font.pixelSize: 12

        Button {
            id: button1
            x: -10
            y: 45
            text: "Button"
            onClicked:main.onClicked_button()
        }
    }

    TextField {
        id: textField1
        x: 257
        y: 329
        placeholderText: qsTr("Text Field")
    }
}

header(类 - 最初设计用于写回文本输入):

#ifndef TEST_H
#define TEST_H

#include <QObject>
#include <QtCore>
#include <QString>
#include <QQuickView>
#include <QQuickItem>
#include <QQmlComponent> // for accessing QML from C++
#include <QQmlContext>   // for accessing C++ from QML

class test : public QObject
{
    Q_OBJECT
public:
    explicit test(QObject *parent = 0);

signals:

public slots:

    void test_button(){
        QQuickView *view = new QQuickView(QUrl("test.qml"));
        view->show();
        QQuickItem *item = view->rootObject();

        QObject *item = object->findChild<QObject*>("textbocks");
        textbox->setProperty("text", str);

        delete textbox;
        return;}
private:
    bool switched;
    bool textOutput;
    QString str = "Hello World";
};

#endif // TEST_H

主要的.cpp文件:

#include "test.h"
#include <QGuiApplication>
#include <QtCore>
#include <QObject>
#include <QQuickItem>
#include <QQmlComponent>
#include <QQmlContext>
#include <QQuickView>
#include <QDeclarativeEngine>
#include <QDeclarativeComponent>
#include <QDeclarativeContext>


test::test(QObject *parent) :
    QObject(parent)
{
}


int main (int argc, char*argv[]) {


    QGuiApplication app(argc, argv);

    QQuickView *view = new QQuickView(QUrl("test.qml"));
    view->show();
    QQuickItem *item = view->rootObject();

    test *funcs = new test();

    // connect button signals to their slots:
    QObject::connect(item, SIGNAL(buttonClicked_button()), funcs, SLOT(test_button()));







    delete funcs;
    return 0;
}

任何帮助将不胜感激。其中一些对我来说仍然有点抽象......谢谢!!

2 个答案:

答案 0 :(得分:2)

因为我注意到您正在使用相同的QML文件“test.qml”创建两个QQuickView:

1.在主要功能(main.cpp)

2.和TEST_BUTTON函数(test.h)

不同的 QObject 。 另一个问题是:

  • 您要将 TextInput 类型的对象分配给 objectName 属性(test.qml),该属性为 String

  • 正在删除(如前面提到的Yekmen)对象( textbox(test.h)= textbocks(test.qml))你通过 setProperty()函数为它分配字符串 str =“hello world”的时间。 啊忘了一个, C ++ 方面的插槽名称,它必须与 QML 声明的相同 p>

答案 1 :(得分:0)

我认为你应该看看这个方法:

 Connections {
 target: area
 onClicked: foo(parameters)

}

例如:area是你的c ++对象。(qmlRegisterType(myclass)) 区域发送信号后,你可以发挥你的功能。 我认为更容易。