在C+;中的循环中读取QML对象(复选框)属性+;:总是相同的值 我做了一个简单代码,从C++循环中的QML读取复选框的值。然而,即使在我用鼠标切换复选框之后,我总是得到“未选中”的值
QML:在C+;中的循环中读取QML对象(复选框)属性+;:总是相同的值 我做了一个简单代码,从C++循环中的QML读取复选框的值。然而,即使在我用鼠标切换复选框之后,我总是得到“未选中”的值,c++,qt,qml,qtquick2,C++,Qt,Qml,Qtquick2,QML: CheckBox { objectName: "simulatorCheckbox" text: "text" } QObject *rootObject = engine.rootObjects().first(); QObject *simulatorCheckboxQ = rootObject->findChild<QObject*>("simulatorCheckbox"); if (!simulatorCheckboxQ) { st
CheckBox {
objectName: "simulatorCheckbox"
text: "text"
}
QObject *rootObject = engine.rootObjects().first();
QObject *simulatorCheckboxQ = rootObject->findChild<QObject*>("simulatorCheckbox");
if (!simulatorCheckboxQ) {
std::cout << "simulatorCheckboxQ not found" << std::endl;
std::exit(1);
}
auto consume = [&simulatorCheckboxQ]() {
while(true) {
QVariant simulatorCheckboxState = simulatorCheckboxQ->property("checkedState");
int simulatorCheckboxStateInt = simulatorCheckboxState.toInt();
if (simulatorCheckboxStateInt==Qt::Unchecked) {
std::cout << "UNchecked!" << std::endl;
} else if (simulatorCheckboxStateInt==Qt::Checked) {
std::cout << "checked!" << std::endl;
} else if (simulatorCheckboxStateInt==Qt::PartiallyChecked) {
std::cout << "PARTIALLY checked!" << std::endl;
}
//delay...
}
};
//run consume as thread
C++:
CheckBox {
objectName: "simulatorCheckbox"
text: "text"
}
QObject *rootObject = engine.rootObjects().first();
QObject *simulatorCheckboxQ = rootObject->findChild<QObject*>("simulatorCheckbox");
if (!simulatorCheckboxQ) {
std::cout << "simulatorCheckboxQ not found" << std::endl;
std::exit(1);
}
auto consume = [&simulatorCheckboxQ]() {
while(true) {
QVariant simulatorCheckboxState = simulatorCheckboxQ->property("checkedState");
int simulatorCheckboxStateInt = simulatorCheckboxState.toInt();
if (simulatorCheckboxStateInt==Qt::Unchecked) {
std::cout << "UNchecked!" << std::endl;
} else if (simulatorCheckboxStateInt==Qt::Checked) {
std::cout << "checked!" << std::endl;
} else if (simulatorCheckboxStateInt==Qt::PartiallyChecked) {
std::cout << "PARTIALLY checked!" << std::endl;
}
//delay...
}
};
//run consume as thread
QObject*rootObject=engine.rootObjects().first();
QObject*simulatorCheckbox=rootObject->findChild(“simulatorCheckbox”);
如果(!simulatorCheckboxQ){
std::cout您有两个坏习惯:
>P>不访问C++中的QML元素,因为它可能是危险的。< /P>
>P>不应该使用while循环,也可以考虑最后一个选项线程。
在这种情况下,GUI不是线程安全的,因此从辅助线程访问此信息是危险的。在这种情况下,只需创建一个映射复选框更改的QObject:
main.cpp
#包括
#包括
#包括
#包括
类CheckBoxMapper:公共QObject{
Q_对象
Q_属性(Qt::CheckState状态读取状态写入设置状态通知状态更改)
公众:
使用QObject::QObject;
Qt::CheckState()常量{
返回m_状态;
}
公众时段:
void setState(Qt::CheckState状态){
如果(m_状态==状态)
返回;
m_状态=状态;
发射状态已更改(m_状态);
}
信号:
void stateChanged(Qt::CheckState状态);
私人:
Qt::CheckState m_state;
};
int main(int argc,char*argv[])
{
QCoreApplication::setAttribute(Qt::AA_enableHighdDiscaling);
QGUI应用程序应用程序(argc、argv);
CheckBoxMapper CheckBoxMapper;
qqmlaplicationengine;
engine.rootContext()->setContextProperty(“checkboxMapper”、&checkboxMapper);
const-QUrl-url(QStringLiteral(“qrc:/main.qml”);
QObject::connect(&engine),&QQmlApplicationEngine::objectCreated,
&应用程序,[url](QObject*obj,const-quorl和objUrl){
如果(!obj&&url==objUrl)
QCoreApplication::退出(-1);
},Qt::QueuedConnection);
引擎加载(url);
QObject::connect(&checkboxMapper,&checkboxMapper::stateChanged,[](Qt::CheckState state){
qDebug()为什么需要while循环?QML属性是“线程安全的”吗?因为这里说我可以从C++@LucasZanella设置它们不,它们不是线程安全的。所以它们有很多答案,不幸的是,它们应用了不好的实践。我发现我做错了什么吗?我没有使用qmake,而是使用cmake。我清理了所有东西并重建了所有东西但我仍然会遇到这些错误。关于stackoverflow的所有答案似乎都依赖于人们忘记放置Q#u对象,这不是这里的情况唯一的区别是我没有在我的main2.cpp
末尾添加,包括“main2.moc”
,因为它抱怨这个文件不存在