如何从 QT 中的.cpp访问 QML 中的一个复选框

How to access one checkbox in QML from .cpp in QT?

本文关键字:复选框 一个 QML QT 中的 访问 cpp      更新时间:2023-10-16

>最近,我遇到了一个小问题,那就是从 QT 中的 cpp 访问 qml 中的复选框。所以问题很简单:我有一个main.qml文件,它有一个复选框,我想根据启动应用程序时保存在QSettings中的配置将" checked "属性更新为true或false。目前,我已经在应用程序启动时成功地从 cpp 文件中的 QSettings 加载了设置。那么如何修改这个cpp文件中的" checked"属性呢?

我试过这个:http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html 并使用了findChild函数,但它不起作用。

1),我把import <QtQuick>放在cpp文件中,但我得到错误QtQuick file can't be found

2),我改成了"import <QtQuick/QQuickView>"。解决了 1) 但此行QObject* object = view.rootObject();出现新错误:

cannot initialize a variable of type 'QObject *' with an rvalue of type 'QQuickItem *`

3),我QObject* object = view.rootObject();这一行改为QQuickItem* object = view.rootObject();,之后使用了QObject* acbox = object->findChild<QObject* >("acbox");。(acbox 是该复选框的对象名称)解决了2)但得到新的错误:

Undefined symbols for architecture x86_64:
  "QQuickView::setSource(QUrl const&)", referenced from:
      ndn::TrayMenu::TrayMenu(QQmlContext*, ndn::Face&) in tray-menu.cpp.1.o
  "QQuickView::QQuickView(QWindow*)", referenced from:
      ndn::TrayMenu::TrayMenu(QQmlContext*, ndn::Face&) in tray-menu.cpp.1.o
  "QQuickView::~QQuickView()", referenced from:
      ndn::TrayMenu::TrayMenu(QQmlContext*, ndn::Face&) in tray-menu.cpp.1.o
  "QQuickView::rootObject() const", referenced from:
      ndn::TrayMenu::TrayMenu(QQmlContext*, ndn::Face&) in tray-menu.cpp.1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有人有什么建议吗?提前感谢!

您可以使用 cpp 中的 setProperty 在 QML 中设置属性,然后将其绑定到 qml 文件中的已检查状态 检查以下代码

C++部分:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine; 
    QQmlComponent component(&engine, QUrl("qrc:/main.qml"));
    QObject *object = component.create();
    object->setProperty("checkstatus", false);
    return app.exec();
}

质量管理部分:

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    property bool checkstatus

    CheckBox {
        id:checkbox
        text: qsTr("checkbox1")
        checked: checkstatus
    }
}

您是否在参考 QT 页面中尝试过该示例? 下面的示例将 QML 信号连接到 C++ 类的插槽,但我认为应该可以做相反的事情:您连接C++变量的信号,谁想要更新复选框。然后它连接到执行更新复选框的 QML 插槽。

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    QQuickView 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();
}