c++ - 与 C++ 代码中的 qml 对象交互

标签 c++ qt qml qtquick2

我正在尝试使用 QtQuick 与来自 C++ 文件的 qml 对象进行交互。但遗憾的是暂时没有成功。知道我做错了什么吗?我尝试了两种方法,第一种方法的结果是 findChild() 返回了 nullptr,第二次尝试时我得到了 Qml 组件未准备好 错误。正确的做法是什么?

主要内容:

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

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    // 1-st attempt how to do it - Nothing Found
    QObject *object = engine.rootObjects()[0];
    QObject *mrect = object->findChild<QObject*>("mrect");
    if (mrect)
        qDebug("found");
    else
        qDebug("Nothing found");
    //2-nd attempt - QQmlComponent: Component is not ready
    QQmlComponent component(&engine, "Page1Form.ui.qml");
    QObject *object2 = component.create();
    qDebug() << "Property value:" << QQmlProperty::read(object, "mwidth").toInt();

    return app.exec();
}

主.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    visible: true
    width: 640
    height: 480

        Page1 {
        }

        Page {
        }
    }
}

Page1.qml:

import QtQuick 2.7

Page1Form {
...
}

Page1.Form.ui.qml

import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

Item {
    property alias mrect: mrect
    property alias mwidth: mrect.width

    Rectangle
    {
        id: mrect
        x: 10
        y: 20
        height: 10
        width: 10
    }
}

最佳答案

findChild 将对象名称作为第一个参数。但不是身份证。

http://doc.qt.io/qt-5/qobject.html#findChild .

在您的代码中,您尝试使用 id mrect 进行查询。所以它可能不起作用。

在您的 QML 中添加 objectName,然后尝试使用对象名称通过 findChild 进行访问。

类似下面的内容(我没有尝试过。所以可能会出现编译时错误):

在QML中添加objectName

Rectangle
{
    id: mrect
    objectName: "mRectangle"
    x: 10
    y: 20
    height: 10
    width: 10
}

然后你的 findChild 如下图所示

QObject *mrect = object->findChild<QObject*>("mRectangle");

关于c++ - 与 C++ 代码中的 qml 对象交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611399/

相关文章:

c++ - UDP套接字recvfrom中的访问冲突读取位置

python - 如何获取从 QListView 中选择的项目?

c++ - 创建一个 QML 插件来运行系统命令?

C++11 std::condition_variable:我们可以将锁直接传递给通知线程吗?

c++ - 如何在 C++ 中使用转换说明符?

c++ - 修改 qmake 文件以构建多个目标以与 '#IFDEF macro' 一起使用

c++ - Qt - 非常简单的切换 Action 绘图

c++ - 有没有办法有效地更新 QML 中的 CAN 数据?

qt - 按住Qml MouseArea移动窗口

c++ - 在 Windows 上从源安装 GLFW