У вас есть 2 плохих практики:
Не открывайте элементы QML из C ++, так как это может быть опасно.
Не следует использовать while-l oop, также рассмотрим последний вариант потоков.
В этом случае GUI не является потокобезопасным, поэтому опасно получать доступ к этой информации из вторичная нить. В этом случае просто создайте объект QObject, который отображает изменения CheckBox:
main. cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>
class CheckBoxMapper: public QObject{
Q_OBJECT
Q_PROPERTY(Qt::CheckState state READ state WRITE setState NOTIFY stateChanged)
public:
using QObject::QObject;
Qt::CheckState state() const{
return m_state;
}
public slots:
void setState(Qt::CheckState state){
if (m_state == state)
return;
m_state = state;
emit stateChanged(m_state);
}
signals:
void stateChanged(Qt::CheckState state);
private:
Qt::CheckState m_state;
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
CheckBoxMapper checkboxMapper;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("checkboxMapper", &checkboxMapper);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
QObject::connect(&checkboxMapper, &CheckBoxMapper::stateChanged, [](Qt::CheckState state){
qDebug() << state;
});
return app.exec();
}
#include "main.moc"
main.qml
CheckBox {
text: "text"
onCheckStateChanged: checkboxMapper.state = checkState
Component.onCompleted: checkboxMapper.state = checkState
}