2012-04-12 3 views
0

나는 QTableViews이 두 개있는 QMainWindow입니다. 각 QTableView에는 고유 한 QSqlRelationalTableModel이 있습니다. 두 모델의 편집 전략으로 OnManualSubmit을 사용하고 있습니다. 두 모델 모두 동일한 데이터베이스를 사용하고 setTable (각각 다른 테이블에 도달 함)을 사용하여 데이터를 채운 다음 select()이옵니다.QTableView가 외래 키를 새로 고치지 않습니까?

두 번째 테이블의 모델은 setRelation에 대한 적절한 호출로 설정되어 첫 번째 모델을 채우는 데 사용 된 테이블에 연결됩니다. 두 번째 (하위)보기에서 나는 view->setItemDelegate(new QSqlRelationalDelegate(view));

모두를 호출합니다. 첫 번째보기에 나타나는 데이터는 두 번째보기의 해당 필드에 드롭 다운 목록에 나열됩니다.

내 문제 : 첫 번째 (상위)보기에 레코드를 추가, 편집 또는 삭제하고 데이터베이스에 저장하면 드롭 다운이 정확하도록 두 번째보기를 새로 고쳐야합니까?

두 번째 (하위)보기에서 저장하지 않은 수정 사항이있을 수 있으며 삭제하지 않으려하지 않으며 아직 저장하지 않으려합니다. 드롭 다운 목록을 적절하게 업데이트하기 만하면됩니다.

child_model->relationModel(fk_col)->select();을 시도했지만 작동하지만 child_model->relationModel(fk_col)->columnCount();은 선택이 부모 테이블의 모든 필드에서 작동하고 있음을 나타내며 불필요한 비관적 인 것처럼 보입니다.

이것은 내 첫 번째 시도 인 <QtSql>QTableView이므로 근본적인 것이 누락되었을 수 있습니다. 두 모델 모두에 동일한 모델을 사용하는 방법이있을 수 있으며 자동으로 새로 고침이 발생합니까? 하위보기 드롭 다운을 새로 고치는 적절한 방법은 무엇입니까?

답변

0

QSqlRelationalTableModel에 의해 실행 된 쿼리는 더 이상 외래 키를 포함하지 않습니다. 쿼리는 다음과 같이 보일 것이다

CREATE TABLE countries (id, name); 
CREATE TABLE cities(id, name, id_country); 

:이 DB 구조를 예를 들어

업데이트 할

의미
SELECT id, name, country_name FROM cities 
    LEFT JOIN countries ON id_country = countries.id; 

, 쿼리가 테이블에 대해 다시 실행해야합니다, 조인 된 테이블이 변경된 경우

자동으로 갱신하려면, 당신은 것 같아요

  • 이 모델의 실제 외래 키를 유지하기 위해 정기적으로 QSqlTableModel를 사용하여,
  • 이 매핑 된 값을 표시하고 만들 QAbstractItemDelegate 클래스를 작성 QComboBox 편집기
  • 은 첫 번째 모델이 변경 될 때마다 뷰에서 매핑 된 열 영역의 다시 그리기를 트리거합니다.