2012-08-05 5 views
0

QSqlQueryModel의 하위 클래스를 사용하여 QML 프로젝트의 ListView에 대한 데이터를 노출했습니다. 저도 같은 시간에이 두 가지를 수행 할 : 다른 스레드에서 QSqlQueryModel을 사용하고 주 스레드에서 포인터로 직접 액세스합니까?

  1. 모델의 포인터setContextProperty()를 사용하여 QML로 모델을 노출.

  2. 모델을 다른 스레드에 남겨 두어 모델 update() (데이터베이스에서 변경된 데이터를 반영하기 위해 마지막 쿼리를 실행 함)을 호출 할 때 모델이 데이터베이스를 다시 쿼리 할 때 UI를 차단하지 않습니다.

가능합니까? 그렇지 않은 경우 더 나은 솔루션은 무엇입니까?

답변

0

내 솔루션은 다음과 서브 클래스 QThread, 그 생성자에 QmlApplicationViewer 포인터를 전달하고 새로운 클래스 DatabaseQueryThread 안에, 내가 거기 뷰어에 대한 컨텍스트 속성을 설정합니다. 이렇게하면 Qt를 통해 포인터로 쿼리 모델에 직접 액세스 할 수 있습니다.

+0

이 문제에 대한 다른 답변을보고 싶습니다. 내가 생각한 것은 모델이 블로킹 될 때 UI가 완료 될 때까지 기다릴 수 있도록 UI 스레드와 공유 된 별도의 스레드에있는 모델입니다. 예를 들어 900k 행의'QSqlTableModel'에서'select()'를 호출하면 내 MBP에서 30 초가 걸리고 UI는 모델이'select()'에서 반환되기를 기다리는 동안 멈 춥니 다. UI는 스레드가 안전하고 스레드간에 모델을 공유 할 수있는 경우 모델에 대한 포인터를 전달하는'QTableView'에서'ready()'와'setModel()'신호를 기다릴 수 있습니다. –

관련 문제