Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 拥有qml函数和c++;相同项目的插槽,反之亦然_C++_Qt_Qml_Qtquick2 - Fatal编程技术网

C++ 拥有qml函数和c++;相同项目的插槽,反之亦然

C++ 拥有qml函数和c++;相同项目的插槽,反之亦然,c++,qt,qml,qtquick2,C++,Qt,Qml,Qtquick2,我想做这样的事情 QML app: { signal qmlSignal function qmlFunction } 及 希望与同一qml对象进行双向通信。 我指的是 < >在QML中从C++中改变值,我们可以做< /P> QDeclarativeEngine engine; QDeclarativeComponent component(&engine, "MyItem.qml"); QObject *object = component.cr

我想做这样的事情

QML app:

  {
    signal qmlSignal
    function qmlFunction
  }

希望与同一qml对象进行双向通信。 我指的是

< >在QML中从C++中改变值,我们可以做< /P>
  QDeclarativeEngine engine;
  QDeclarativeComponent component(&engine, "MyItem.qml");
  QObject *object = component.create();

  QVariant returnedValue;
  QVariant msg = "Hello from C++";
  QMetaObject::invokeMethod(object, "myQmlFunction",
     Q_RETURN_ARG(QVariant, returnedValue),
     Q_ARG(QVariant, msg));

 qDebug() << "QML function returned:" << returnedValue.toString();
 delete object;
QDeclarativeEngine发动机;
QDeclarativeComponent组件(&engine,“MyItem.qml”);
QObject*object=component.create();
QVariant返回值;
QVariant msg=“你好,来自C++”;
QMetaObject::invokeMethod(对象,“myQmlFunction”,
Q_RETURN_ARG(QVariant,returnedValue),
Q_ARG(QVariant,msg));

qDebug()==更新的问题===

您可以在QML中调用slot或Q_可调用的方法来更改QML中的“C++属性”。不过,您需要将C++对象作为上下文属性公开。您需要在下面这样写:

myclass.h main.cpp main.qml ==评论中的其他问题===

C++中有QQuy属性,并且将该属性绑定到QML中的属性,或者捕获称为“FO”属性的OnFooCurchange信号处理程序。

myclass.h main.cpp main.qml ==原始问题===

似乎你想问你是否可以同时在C++和QML中同时声明,即QML中的一些部分,然后在QML中。 <>我想你需要用Qt元类型系统登记(C++ MyRealStestMeta,等等)你的C++类型,然后你可以用QML(可能是父母)的一个项目来实现你想要的。 这是供进一步阅读的相关文档:

为方便起见,下面是一些内联代码:

信息.h
你是想问一下你是否能同时从C++和QML中声明一个类/项?你能再加一行来说明C++中的调用同一个代码中的QML吗?@尼鲁:你是什么意思?试图添加QML源设置,如果这是你的意思,或者你想调用一个JavaScript函数写在QML,从C++?不过,您的问题似乎没有包含这一点。:)假设我必须从系统调用中读取一些数据,并希望更新qml应用程序中的信息。因此,我需要使用QTimer重复调用函数。如何将这些信息传递给应用程序?@heeru:这就是属性绑定的目的。。。您在C++中有QQuy属性,并且将该属性绑定到QML中的属性,或者捕获称为“FO”的属性的OnFooCurchange信号处理程序。我想我理解您的意思。当我们改变C++中的某个值时,我们需要发出信号,并且应该在QML中处理该信号。
  QDeclarativeEngine engine;
  QDeclarativeComponent component(&engine, "MyItem.qml");
  QObject *object = component.create();

  QVariant returnedValue;
  QVariant msg = "Hello from C++";
  QMetaObject::invokeMethod(object, "myQmlFunction",
     Q_RETURN_ARG(QVariant, returnedValue),
     Q_ARG(QVariant, msg));

 qDebug() << "QML function returned:" << returnedValue.toString();
 delete object;
class MyClass : public QObject
{
   Q_OBJECT
  public slots:
   void cppSlot(const QString &msg) {
     qDebug() << "Called the C++ slot with message:" << msg;
 }
};

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

   QDeclarativeView view(QUrl::fromLocalFile("MyItem.qml"));
   QObject *item = view.rootObject();
   MyClass myClass;
   QObject::connect(item, SIGNAL(qmlSignal(QString)),
                  &myClass, SLOT(cppSlot(QString)));

   view.show();
   return app.exec();
 }
class MyClass : public QObject
{
    Q_OBJECT
    public:
        MyClass(QObject *parent) : QObject(parent) { ... }

    Q_INVOKABLE void myInvokable();

    public slots:
        void mySlot();

    ...
}
...

MyClass myClassObject;
QQuickView view;
view.rootContext()->setContextProperty("myClassContextProperty", &myClassObject;
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();

...
Button {

    ...

    // You can replace onClicked with your own custom signal

    onClicked: myClassContextProperty.myslot()

    // or

    onClicked: myClassContextProperty.myInvokable()

    ...
}
class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(foo READ foo NOTIFY fooChanged)
    public:
        MyClass(QObject *parent) : QObject(parent) { ... }

        int foo() const;        

    public signals:
        void fooChanged();

    public slots:
        void mySlot() { foo = 5; emit fooChanged(); };

    private:
        int foo;

    ...
}
...

MyClass myClassObject;
QQuickView view;
view.rootContext()->setContextProperty("myClassContextProperty", &myClassObject;
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();

...
...
// Bind foo to bar
property int bar: myClassContextProperty.foo
class Message : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
public:
    // ...
};

qmlRegisterType<Message>("com.mycompany.messaging", 1, 0, "Message");

...
import com.mycompany.messaging 1.0

Message {
    author: "Amelie"
    creationDate: new Date()
}