2011-02-11 2 views
1

QSqlQueryModel에 INSERT 또는 DELETE 쿼리를 설정하면 내 QTableView이 엉망이됩니다. 예를 들어 view->hideColumn(ID);을 호출하여 ID 열을 숨겼지만 INSERT 또는 DELETE 후 ID 열이 표시됩니다.왜 INSERT 및 DELETE가 QTableView (Qt, C++, sqlite)를 망칠까요?

이 경우 어떻게하면 내보기가 이전 설정으로 자동 재설정 될 수 있습니까?

+0

포스트 업 코드의 일부에 관하여, 당신이 모델과 뷰를 초기화하고 조각이 도움이 될 것입니다. –

+0

전체 코드는 리비전 1751에서 볼 수 있습니다. http://szte-wsn.svn.sourceforge.net/viewvc/szte-wsn/private/ali/SQL/SQLDialog/SQLDialog.cpp?view=log 이상한 것은 이 : SELECT 내보기를 엉망으로하지 않습니다, INSERT 및 삭제 만 않습니다. 나는 그들이보기의 이전 설정을 재설정 뭔가를 방아쇠 것 같아요. – Ali

답변

3

문제는 QSqlQueryModel::setQuery에 있습니다. 콘텐츠가 다시로드되고 행에 \ delete가 삽입 될 때마다 호출됩니다. setQuery 구현을 살펴보면 쿼리 모델에 따라 열 설정을 변경하여 뷰 열 업데이트를 트리거해야하는 변경 사항을 제안 할 수 있습니다.

Qt는 문서에서 알 수 있듯이

:

QSqlQueryModel 클래스는 SQL 결과 세트에 대한 읽기 전용 데이터 모델을 제공합니다.

그래서 QSqlQuery을 직접 호출하여 데이터 업데이트를 호출 한 다음 동일한 쿼리로 모델을 다시로드합니다. 또는 QSQLTableModel으로 전환하는 것을 고려하십시오. 이는 단일 테이블 내용 조작에 매우 유용하며 삽입 및 업데이트 및 삭제를 지원합니다. 아래의 예는 당신을 위해 일하는 것이 표시되는 경우

데이터베이스, 뷰와 모델을 설정 :

QSqlTableModel *_model; 
QTableView *_view; 

...

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(":memory:"); 
db.open() ; 

QSqlQuery query; 
query.prepare("CREATE TABLE IF NOT EXISTS person (id INTEGER UNIQUE PRIMARY KEY, name VARCHAR(30))"); 
query.exec(); 
query.prepare("INSERT INTO person (name) VALUES ('test1')"); 
query.exec(); 
query.prepare("INSERT INTO person (name) VALUES ('test2')"); 
query.exec(); 

_model = new QSqlTableModel(this, db); 
_model->setTable("person"); 
_model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
_model->select(); 
_model->setHeaderData(1, Qt::Horizontal, tr("name")); 
_model->setSort(1, Qt::AscendingOrder); 

_view = new QTableView(this); 
_view->setModel(_model); 
_view->hideColumn(0); 

가 새 행 추가 :

QSqlRecord record; 
_model->insertRecord(-1, record); 

을 선택한 행 삭제 :

,210

제출 변경 :이 도움이

_model->submitAll(); 

희망,

+0

+1 그리고 많은 감사합니다! 나는 당신의 해결책을 시도하고 여기에 돌아올 것입니다! – Ali

+0

직접 QSqlQuery 호출은 현재 문제의 최선의 선택 인 것 같습니다. 많은 도움에 감사드립니다! – Ali