Qt는 5.1을 사용하여 나는이 있습니다Q_PROPERTY 동기 이벤트를 읽기 위해 C++에서 QML로 신호가 방출되고 있습니까?
Q_PROPERTY(float d1 MEMBER data1 NOTIFY datas_changed_signal)
Q_PROPERTY(float d2 MEMBER data2 NOTIFY datas_changed_signal)
....
void setOBJ(nobj){
obj=nobj; //these are pointers to a data structure
data1=nobj->data1(); //assign to member of this class
data2=nobj->data2();
emit datas_changed_signal();
}
내 클래스는 일부 데이터, nobj
에 대한 포인터를 수신 한 후 내 QML이 데이터에 액세스 할 수 있도록합니다. 실제로 nobj
에는 단지 2 개 이상의 데이터 항목이 포함되어 있지만 여기서는 간단하게 설명합니다.
몇 가지 사실을 알고 싶습니다. 첫째, setOBJ
이 자주 자주 호출되면 어떻게됩니까? setOBJ
이 다시 호출되기 전에 QML에 알리고 MEMBER
(data1 또는 data2)을 읽지 않을 위험이 있습니까? 이 때문에 QML이 일부 업데이트를 놓칠 수 있습니까? 예를 들어 비동기식 인 경우이 문제가 발생합니다. 또는, QML에서이 신호가 방출 될 때마다 항상 데이터를 가져올 수 있습니까?
둘째, 전달 된 개체의 데이터를 저장하기 위해 중간 데이터 멤버를 만드는 데 약간의 불필요한 오버 헤드가있는 것 같습니다. nobj
.
Q_PROPERTY(float d1 MEMBER obj->data1() NOTIFY datas_changed_signal)
을하지만 MOC는 (컴파일되지 않습니다) 이런 식으로 Q_PROPERTY
를 사용하여 좋아하지 않는 것 : 내가 대신이 시도. 비슷한 대안이 있을까요?
업데이트 : C++에서 QML로 데이터를 전송하는 Q_PROPERTY 대신 실행 가능한 대체 코드 인 this method (link)이 발견되었으므로 데이터 조각을 QML 함수의 인수로 보낼 수 있습니다. 그게 좋은 대안인가?
Q_PROPERTY를 사용하여 동일한 데이터를 QML에 보내고 invokable 메서드를 통해 동일한 데이터를 보내는 테스트를 수행했습니다. 내 데이터가 자주 변경되고 invokable 메서드에는 데이터가 손실되지 않았습니다. 하지만 Q_PROPERTY가 onDataMember 변경된 신호를 사용하면 많은 데이터가 삭제되었습니다. 배후에 어떤 종류의 대기열 작업이 존재하고 QML이보기 전에 C++ 데이터가 변경 될 수도 있습니다. – johnbakers
데이터 변경시 슬롯이 호출되고 있습니까? – Mercurial
일반적으로 QML은 종종 (예 : 모달과 같은 상태를 갖는) GUI 함수를 호출하기 때문에 QML을 사용할 때 더 많이 동시성을 고려해야 할 것입니다. 다른 신호를 처리하기 전에 완료해야 할 수도 있습니다. 동시성 문제의 증상은 다른 플랫폼에서 다를 수 있습니다. – bootchk