2013-03-20 3 views
3

일부 데이터베이스 테이블을 탐색하는 소프트웨어를 만들고 사용자가이 테이블을 편집 할 수 있습니다. 이 link을 읽은 후 필자는 필자가 필요로하는 모델/뷰를 좋은 접근 방법으로 삼았다. 다음 모형을 살펴보십시오. enter image description hereQt 모델/뷰 및 QTableView의 기본 개념

이 사실을 알고 있으므로 개념을 이해하고 있는지 확인해야합니다. 좋은 방향으로 나아가는 지 말해주세요.

  1. 내 테이블마다 모델 클래스를 생성해야하나요? (하위 클래스 QAbstractModel). 그것은 다음과 같이 표시됩니다

    class citiesTableModel : public QAbstractItemModel 
    { 
        Q_OBJECT 
    } 
    
  2. citiesTableModel 생성자는 데이터베이스의 테이블 에서 데이터를 가져올 것인가?

  3. 다른 모델마다 QTableView의 하위 클래스를 만들어야합니까?

    class citiesTableView : public QTableView{} 
    
  4. Finnaly, 나는 view.setData과 view.setModel이 가 다시 구현 될 필요가 있다고 생각? setModel은 각 모델 행을 반복하여 QTableView를 만들고 setData는 모델에 새 데이터를 추가하기위한 적절한 쿼리를 수행합니까?

대단히 감사합니다.

어느 쪽이든 당신의 데이터베이스는 SQL 데이터베이스입니다 :

답변

1

.

사이먼이 말하길

, 그것은 아주 쉽게 사용할 수 있습니다

QSqlTableModel *model = new QSqlTableModel(parentObject, database); 
model->setTable("employee"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select(); 
model->setHeaderData(0, Qt::Horizontal, tr("Name")); 
model->setHeaderData(1, Qt::Horizontal, tr("Salary")); 

QTableView *view = new QTableView; 
view->setModel(model); 
view->hideColumn(0); // don't show the ID 
view->show(); 

나는 내 각 테이블의 모델 클래스를 만들 필요가 됐을까?

예, 한 모델은 하나의 sql 테이블을 나타냅니다.

citiesTableModel 생성자가 데이터베이스의 테이블에서 데이터를 가져 옵니까?

QSqlTableModel 당신을 위해 그것을 할 것입니다 :

QSqlTableModel *model = new QSqlTableModel(parentObject, database); 
model->setTable("employee"); 
model->select(); 

내가 모든 다른 모델에 대한 QTableView을 서브 클래스해야합니까?

아니요. 하나의 QTableviewsetModel을 사용하여 설정 한 모델을 표시 할 수 있습니다.

Finnaly, 필자는 view.setData 및 view.setModel이 으로 다시 구현되어야한다고 생각하십니까? setModel은 각 모델 행을 반복하여 QTableView를 만들고 setData는 모델에 새 데이터를 추가하기위한 적절한 쿼리를 수행합니까? 당신의 테이블 셀을 편집하거나 후에는 submitAll을 사용하여 제출 될 때

당신이 setEditStrategy를 사용하여 설정 편집 전략에 따라, 변경 내용이 커밋됩니다.

또한 QDataWidgetMapper을 살펴볼 수도 있습니다. 모델 데이터를 다른 위젯에 매핑하고 해당 위젯을 편집하는 변경 사항을 추적 할 수 있습니다.

+0

Thx입니다. 실제로 tought보다 조금 더 쉽게 보입니다. 질문 : 우리의 데이터베이스는 postgreSQL입니다. QSqlTableModel이이 데이터베이스에서 작동하는지 알고 있습니까? 또한 편집 전략의 경우 실제로는 tableview 자체를 통해 수정할 수 없으며 양식 (bellow tableview) 만 사용하여 수정할 수 있습니다. 그것은 일을 훨씬 쉽게 만들어 주는가? Finnaly, QTableView를 서브 클래스 할 필요가 없다고 확신합니까? 부울을 체크 박스로 변환하고 싶습니까? Thx – peterphonic

+1

예, 적절한 qt sql 플러그인이 있으면 모든 데이터베이스에서 작동 할 수 있습니다. 예, 테이블을 통해 데이터를 편집 할 수 있습니다. 부울 값을 체크 박스로 표시하려면 [delegate classes] (http://qt-project.org/doc/qt-4.8/model-view-programming.html#delegate-classes)를 사용해야합니다. – hank

+0

답을 다시 Thx. 내가 충분히 명확하지 않은 무엇인가. 사실, 이것은 설계상의 결정입니다. 우리가 원하는 것 : 사용자는 테이블보기 자체를 편집 할 수 없습니다. 사용자는 먼저 행을 선택해야하며 그에 따라 양식이 채워지고 사용자는 양식을 수정합니다. – peterphonic

3

는 기본적으로 서로 다른 옵션이 있습니다. 하위 클래스 QSqlTableModel을 사용할 수 있습니다. 그렇지 않으면 처음부터 모델을 만들려면 자신 만의 모델을 만들지 만 그 점은 보이지 않습니다. 또한 QTableModel을 예로들 수 있습니다.

항상 테이블 모델이기 때문에 각 테이블에 대한 모델을 만들 필요가 없습니다. 이 모델은 주로 특정 데이터로 행을 추가하고 제거하는 방법을 정의합니다.

보기와 관련하여 행 및 열 (예 : 이벤트 끌기)에 대한 사용자 지정 동작을 추가하려면 QTableView를 상속해야합니다.

사용자 지정보기의 유일한 요소는보기 또는 열의 대리자뿐입니다. 기본적으로 모델의 불리언 값을 체크 박스로 변환합니다.

자세한 정확도는 SpinBox delegate을 참조하십시오.

희망이 도움이됩니다.

편집 : PostgreSQL의의 경우

당신이 QsqlDatabase에 추가 할 수 있습니다 :
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 
db.setHostName("acidalia"); 
db.setDatabaseName("customdb"); 
db.setUserName("mojito"); 
db.setPassword("J0a1m8"); 
bool ok = db.open(); 

그런 다음 QSqlTableModel에 DB를 전달합니다.당신은 외래 키에서 가져 오는 필드와 더 관계 동작을해야하는 경우 사용할 수 있습니다 : 당신은 이것에 대한 QSqlTableModel을 사용할 수 있습니다

QSqlRelationalTableModel 
QSqlRelationalDelegate 
+0

QSqlTableModel은 postgreSQL 데이터베이스에서 작동합니까? 고마워! – peterphonic

+1

예, QSqldatabase로 작업하는 모든 데이터베이스. 답을 위해서는 – Kikohs