2016-08-28 5 views
0

초보자 용 질문이 있습니다. Model-View-Controller 디자인 패턴을 올바르게 이해하는지 확신 할 수 없습니다.QStandardItemModel 전체 파일을 읽은 후 QTableView를 업데이트하십시오.

어쩌면 내 문제를 설명하기 시작합니다. 파일에서 데이터를 읽는 중입니다. 10 초 후에 그 데이터를 테이블에 표시한다고 가정 해 봅시다. 문제는 어떻게 데이터를 저장해야합니까? QStandardItemModel 외에도 파일에서 데이터를 읽고 다른 스레드에서 사용할 다른 컨테이너가 있어야합니까? 예를 들어 Gui 스레드에 QStandardItemModel이 있고 다른 컨테이너를 만들면 QVector이라고합시다. 파일의 데이터를 QVector으로로드 한 다음 데이터를 QVector에서 QStandardItemModel으로 옮깁니 까?

내가 다른 스레드에서 QStandardItemModel를 사용하고 QStandardItemModel에 파일에서 직접 데이터를 읽을 수 없습니다 QStandardItemModelappendRow 후보기를 업데이트하는 신호를 방출하기 때문에 내가 아는 한 GUI 동결 때문이다.

아니면 전체 파일을 QStandardItemModel에로드 할 때만 사용자 지정 모델을 만들고 메서드를 추가하여보기를 업데이트해야합니까? QTableView에는 데이터 용 컨테이너가 있으며 모델과 동기화되지 않았습니까? 그것은 가능/올바른 방법입니까?

새 파일을 읽을 때 어떤 상황입니까?

도움 주셔서 감사합니다.

+0

파일에서 한 번만 또는 몇 번만 데이터를로드 하시겠습니까? –

+0

예, 둘 이상입니다. 하나만있는 경우에는 GUI와 파일 스레드간에 QStandardItemModel을 공유 할 수 있다고 생각합니다. 새 파일을 읽을 때 모델을 새 데이터로만 채우고 싶습니다. 나는 파일을 읽을 때마다 새 모델을 설정하는 것에 대해 생각하고 있었지만 멋지고 효율적인 해결책이 아닌 것 같아요. btw. 이 경우 오래된 QStandardItemModel에서 메모리를 제거하는 방법은 무엇입니까? – Cherubim

+0

파일을 모델로 읽으 려 할 때 * 10 초 * 걸리면 매우 큰 ** 행/열 수를가집니다. QStandardItemModel에서 한번에로드하지 않고'QAbstractItemModel', ['canFetchMore'] (https://doc.qt.io/qt-5/qabstractitemmodel.html#canFetchMore)을 사용하여 게으른 로딩을하는 것이 좋습니다. , ['fetchMore'] (https://doc.qt.io/qt-5/qabstractitemmodel.html#fetchMore). 이것은 [QSqlQueryModel'] (https://code.qt.io/cgit/qt/qtbase.git/tree/src/sql/models/qsqlquerymodel.cpp#n190)에서 내부적으로 사용되는 전략인데, 대형 * 모델. – Mike

답변

0

난 당신이 해결 문제에 대한 조치를 할 수 있다고 생각 :

  1. 당신이 nullptrQTableView에 대한 파일에서 새 데이터, 설정 모델을로드해야

    .
  2. 파일의 데이터가 포함 된 비 기본 (비 GUI) 스레드에서 QStandardItemModel (이 모델은 QTableView의 모델이었습니다)을 채 웁니다.
  3. 기본 (GUI) 스레드에서 QTableView에 대한 데이터가있는 모델을 설정하십시오. 물론

,이 같은 사용자 뭔가를 보여줄 수 있습니다 또한 당신의 문제를 해결하는 가장 간단한 방법 : 당신은 주 (GUI)에 QStandardItemModel에 데이터를로드하면서, "데이터 로딩 ... 기다려주십시오"스레드 .