如何从 QT 中的 .cpp 访问 QML 中的一个复选框?
How to access one checkbox in QML from .cpp in QT?
最近遇到一个小问题,就是QT中的cpp访问qml中的checkbox。所以问题很简单:我有一个 main.qml
文件,其中有一个复选框,我想根据我保存的配置将“checked
” 属性 更新为 true 或 false在我启动应用程序时在 QSettings 中。目前,我已经在应用程序启动时从 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)
有人有什么建议吗?提前致谢!
您是否尝试过参考 QT 页面中的示例?下面的示例将 qml 信号连接到 C++ class 的插槽,但我认为应该可以执行相反的操作,即:连接想要复选框更新的 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();
}
你可以在cpp中使用set属性在qml中设置一个属性然后绑定到qml文件中的checked状态查看下面的代码
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();
}
QML 部分:
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
property bool checkstatus
CheckBox {
id:checkbox
text: qsTr("checkbox1")
checked: checkstatus
}
}
最近遇到一个小问题,就是QT中的cpp访问qml中的checkbox。所以问题很简单:我有一个 main.qml
文件,其中有一个复选框,我想根据我保存的配置将“checked
” 属性 更新为 true 或 false在我启动应用程序时在 QSettings 中。目前,我已经在应用程序启动时从 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)
有人有什么建议吗?提前致谢!
您是否尝试过参考 QT 页面中的示例?下面的示例将 qml 信号连接到 C++ class 的插槽,但我认为应该可以执行相反的操作,即:连接想要复选框更新的 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();
}
你可以在cpp中使用set属性在qml中设置一个属性然后绑定到qml文件中的checked状态查看下面的代码
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();
}
QML 部分:
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
property bool checkstatus
CheckBox {
id:checkbox
text: qsTr("checkbox1")
checked: checkstatus
}
}