Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中的循环中读取QML对象(复选框)属性+;:总是相同的值 我做了一个简单代码,从C++循环中的QML读取复选框的值。然而,即使在我用鼠标切换复选框之后,我总是得到“未选中”的值_C++_Qt_Qml_Qtquick2 - Fatal编程技术网

在C+;中的循环中读取QML对象(复选框)属性+;:总是相同的值 我做了一个简单代码,从C++循环中的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

QML:

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”
,因为它抱怨这个文件不存在