Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中调用QQuickItem(TextArea)的方法+; 在C++中调用qQuestItIt的方法是可能的。< /P>_C++_Qt_Methods_Qt Creator_Qml - Fatal编程技术网

在C+中调用QQuickItem(TextArea)的方法+; 在C++中调用qQuestItIt的方法是可能的。< /P>

在C+中调用QQuickItem(TextArea)的方法+; 在C++中调用qQuestItIt的方法是可能的。< /P>,c++,qt,methods,qt-creator,qml,C++,Qt,Methods,Qt Creator,Qml,我的想法是使用Qml创建的图形用户界面制作一个程序。我想在这个用户界面上有一个日志。现在我在上面放置了一个TextArea,并通过append()方法添加日志条目。使用这种方法非常简单,但是我不知道如何在C++中实现这一点。这是我节目的开始。我通过一个额外的“JavaScript”函数解决了这个程序,但我对此并不满意 main.qml import QtQuick 2.0 import QtQuick.Controls 1.0 Item { id: root width: 40

我的想法是使用Qml创建的图形用户界面制作一个程序。我想在这个用户界面上有一个日志。现在我在上面放置了一个TextArea,并通过append()方法添加日志条目。使用这种方法非常简单,但是我不知道如何在C++中实现这一点。这是我节目的开始。我通过一个额外的“JavaScript”函数解决了这个程序,但我对此并不满意

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.0

Item {
    id: root
    width: 400
    height: 400

    signal requestMessage()

    function addLine() {
        log.append(addField.text.toString())
        addField.text = ""
    }

    function cMessage(msg) {
        log.append(msg)
    }


    TextArea {
        id: log
        x: 20
        y: 28
        objectName: "log"
        width: 340
        height: 200

        anchors.right: parent.right
        anchors.rightMargin: 20
        anchors.left: parent.left
        anchors.leftMargin: 20
    }

    TextField {
        id: addField
        x: 20
        y: 252
        height: 25

        anchors.right: addButton.left
        anchors.rightMargin: 10
        anchors.left: parent.left
        anchors.leftMargin: 20
    }

    Button {
        id: addButton
        x: 284
        y: 252
        width: 96
        height: 27

        text: "Hinzufügen"

        anchors.right: parent.right
        anchors.rightMargin: 20

        MouseArea {
            anchors.fill: parent
            onClicked: addLine()
        }
    }

    Button {
        id: bindingButton
        x: 239
        y: 290

        text: "Nachricht von C++"

        anchors.right: parent.right
        anchors.rightMargin: 20

        MouseArea {
            anchors.fill: parent
            onClicked: requestMessage()
        }
    }
}
main.cpp

#include <QGuiApplication>
#include <qtquick2applicationviewer.h>
#include <QQuickItem>
#include <QObject>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Bindings/main.qml"));
QQuickItem *item = viewer.rootObject();

MyClass myClass;
myClass.setViewer(&viewer);
QObject::connect(item, SIGNAL(requestMessage()), &myClass, SLOT(treatMessage()));

viewer.show();
return a.exec();
#包括
#包括
#包括
#包括
#包括“myclass.h”
int main(int argc,char*argv[])
{
QGUI应用程序a(argc、argv);
QTQuick2应用程序查看器;
setMainQmlFile(QStringLiteral(“qml/Bindings/main.qml”);
QQuickItem*item=viewer.rootObject();
MyClass MyClass;
myClass.setViewer(&viewer);
连接(项目,信号(requestMessage()),&myClass,插槽(treatMessage());
viewer.show();
返回a.exec();
}

最后是myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QQuickItem>
#include <qtquick2applicationviewer.h>

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = 0);
    void setViewer(QtQuick2ApplicationViewer *newViewer) {
        this->viewer = newViewer;
    }

signals:

public slots:
    void treatMessage() {
        QQuickItem *root = viewer->rootObject();
        QVariant message = "hello from the other side";
        QMetaObject::invokeMethod(root, "cMessage", Q_ARG(QVariant, message));
    }

protected:
    QtQuick2ApplicationViewer * viewer = 0;
};

#endif // MYCLASS_H
\ifndef MYCLASS\u H
#定义MYCLASS_H
#包括
#包括
#包括
类MyClass:公共QObject
{
Q_对象
公众:
显式MyClass(QObject*parent=0);
void setViewer(QtQuick2ApplicationViewer*newViewer){
此->查看器=新查看器;
}
信号:
公众时段:
无效消息(){
QQuickItem*root=viewer->rootObject();
QVariant message=“来自另一端的您好”;
QMetaObject::invokeMethod(根,“cMessage”,Q_ARG(QVariant,message));
}
受保护的:
QtQuick2ApplicationViewer*viewer=0;
};
#endif//MYCLASS\u H
那么,有人知道一种更优雅地完成这项任务的方法吗?或者有人能告诉我如何调用append()方法吗


关于

您完全可以从事物的QML端调用QML项上的方法。请参见此处的文档:

您已经准备好了大部分内容,只需通过以下方式找到您的实际文本区域:

  • 将TextArea上的objectName属性设置为类似“log”的值
  • 在QQuickView的
    rootObject()
    上调用
    findChild(QStringLiteral(“log”))
    。见:
  • 一旦有了对它的引用,就可以对其使用
    QMetaObject::invokeMethod
    来调用append方法。见:

  • 非常感谢。这个很好用。我必须认识到append需要一个QVariant对象作为参数,而不是QString对象。你现在知道为什么了吗?文档中说append()需要一个QML字符串作为参数。所以我认为C++中的对应词可以是QString。