【问题标题】:Invoke QML method from C++从 C++ 调用 QML 方法
【发布时间】:2018-05-14 09:10:54
【问题描述】:

我想从我的类MyBacklogg 中调用MyMap 中的一个方法,如果我没有该类中的对象参数,我该怎么做?

我将在MyBacklogg 中接收一个字符串、一个 QByteArray 或一个 QDataStream,这取决于哪个效果最好,我想将这些传递给我的 GUI。

main.cpp:

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/qml/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QObject *item = engine.rootObjects().first();
    MyTcpSocket s;
    s.init();
    QObject::connect(item, SIGNAL(sendSignal()), &s, SLOT(doSlot()));

    return app.exec();
}

main.qml:

ApplicationWindow {
    id: appWindow
    visible: true
    height: 600
    width: 800
    title: qsTr("MyApp")
    signal sendSignal()

    RowLayout{
        visible: true
        anchors.fill: parent

        MyMap {
            id: mapview
            function myFunc() {
                //function called from MyBacklogg
            }
            function myOtherFunc() {
                sendSignal()
            }
        }
    }
}

MyBacklogg.cpp:

#include "mybacklogg.h"

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

void MyBacklogg::init()
{
    //initialize
}

void MyBacklogg::doSlot()
{
    //function call from MyMap
}

void MyBacklogg::callMethod()
{
    ??????????????????????????????
    QMetaObject::invokeMethod(object, "myFunc",
        Q_RETURN_ARG(QVariant, returnedValue),
        Q_ARG(QVariant, msg));
    ??????????????????????????????
}

【问题讨论】:

标签: c++ qt qml qqmlcomponent qqmlapplicationengine


【解决方案1】:

您是否尝试通过将object 指针传递给MyBacklogg 并将其保留为类成员来初始化它?

尽管如果你从 C++ 调用 QML 函数,在 99.9% 的情况下你做错了。

正确的解决方案是从 C++ 发出一个信号并在 QML 端为它安装一个处理程序。

【讨论】:

  • 不,我没有,但如果你说的是真的,它甚至可能不值得一试。如果使用信号和处理程序更好? @dtech
  • 将 C++ 视为应用程序的独立内核层。 QML 只能与之交互的东西。 QML 应该访问和驱动 C++ 的东西,而不是相反。在相反的情况下是有意义的并且是不可避免的。最好尽可能避免它,以防止糟糕的设计增长并最终破坏您的应用程序,迫使您返回并重新设计东西。
  • 好吧,这是我第一次使用 qt、qml 和 c++,所以有点困惑。如何访问我的 engine.rootObjects 的子对象?不确定要输入什么类型,因为这些来自 QtQuick 项目。如果我想连接到 MyMap 及其信号而不是 main.qml 及其信号。
  • 您将一些 C++ 对象暴露给 QML,并让连接和绑定以及所有其他内容到 QML。请记住:enigne.rootObjects 生活在 C++ 中 - 这就是您不想访问它的子级的地方。
  • okey,在我的 C++ 类中将字符串或其他参数作为参数,并在我的 main.cpp 中执行 qmlRegiser,然后在我的 GUI 中显示该参数的值是否更好?
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2017-07-27
相关资源
最近更新 更多