2017-11-09 23 views
0

안녕하세요, QListView 위젯이 내 사용자 인터페이스에 올바르게 표시되어 있습니다.QListView setModel QMetaObject :: invoke를 통해 호출하는 데 문제가 있습니다.

전적으로 완전히 다른 타사 라이브러리에 대한 콜백을 등록합니다. 이 콜백은 내 사용자 인터페이스와 완전히 별개의 스레드에서 호출됩니다. 나는 QListView 위젯과 상호 작용하는 새로운 데이터 모델을 설정하려면이 콜백이 필요합니다, 그래서 내가 그러나

MyDataModel * model = new MyDataModel(ui->listViewWidget); 
QMetaObject::invokeMethod(ui->listViewWidget, "setModel", Q_ARG(MyDataModel *, model)); 

를 사용할 필요가 생각, 작동하지 않습니다. QListView 위젯에 데이터가 표시되지 않는다. QMetaObject :: invokeMethod에서 반환 값을 디버깅했습니다. 그리고 QListView에 "setModel"이라는 메서드가 없다는 false를 반환합니다. 내가 콜백을 준비 때, 즉 푸시 버튼 on_clicked() 이벤트를 통해 사용자 인터페이스 스레드를 통해 전화를

MyDataModel * model = new MyDataModel(ui->listViewWidget); 
ui->listViewWidget->setModel(model); 

이 완벽하게 작동로 전화를 걸, 등등 "로 setModel"방법이있다 할 QListView ..

QMetaObject :: invokeMethod가 작동하지 않는 이유를 이해할 수있는 누군가가 도와 주시겠습니까?이 방법으로 invokeMethod를 호출해야하는 이유를 이해할 수 있습니까? 즉, 이벤트 루프 스레드에서 실행할 필요가있는 것에 대한 내 스레드 가정이 맞습니다.

당신은 혼란스럽고 혼란 스럽습니다. 마크.

답변

1

메서드 QMetaObject::invokeMethod은 개체의 슬롯 또는 신호 만 호출합니다. 그러므로 setModelslot으로 선언되어야합니다. 또한 Q_ARG()은 해당 유형의 유형 이름 및 const 참조를 사용합니다.

+0

삭제 해 주셔서 감사합니다. 그렇다면 다른 스레드에서 모델을 설정하는 것에 대해 걱정할 권리가 있습니까? 그렇지 않으면 안전합니까? 또는 UI 이벤트 루프에서 호출되는 메서드를 얻는 또 다른 방법이있을 수 있습니다. – ScaryAardvark

+0

'QMetaObject :: invodeMethod'라는 이름의 연결 유형이'Qt :: QueuedConnection' 또는'Qt :: AutoConnection' 인 경우에는 안전하게 수행 할 수 있습니다. – svm

+0

좋아요, 이제 setModel이 신호 나 슬롯이 아니라는 것을 설명 했으므로 모델을 설정하는 적절한 방법을 찾아야합니다. 나는 틀린 방식으로 접근하고 있거나 어렵지 않을 것이라고 확신합니다. – ScaryAardvark