2014-12-11 3 views
0

QT ComboBox를 sqlite 데이터베이스에 연결하는 다음 코드가 있는데 잘 작동합니다. 그러나 내 데이터베이스에는 외래 키와 연결된 범주 및 항목 테이블이 있습니다. ComboBox에서 정보를 가져올 때 상자에 나열된 이름이 아닌 Category_ID를 가져와야합니다. 모델을 사용하여 ComboBox ItemData를 Category_ID 필드로 설정하거나 모델을 사용하여 ComboBox ItemData를 내 Category Object로 설정하는 방법은 무엇입니까?QT ComboBox 데이터베이스의 항목 데이터

void MainWindow::populatCat() 
{ 
    QSqlQueryModel *model = new QSqlQueryModel(); 
    QString sql; 
    sql = "select Category_Name From Category ORDER BY Category_Name ASC;"; 
    QSqlQuery* query = new QSqlQuery(db); 
    query->prepare(sql); 
    if(!query->exec()){ 
     qDebug() << "Query Erorr: " << query->lastError(); 
    }else{ 
     qDebug() << "Query Successful: " << query->lastQuery(); 
    } 
    model->setQuery(*query); 
    ui->cboCat->setModel(model); 
} 
+0

쿼리에서 Category_Name 및 Category_ID를 가져 오지 않는 이유는 무엇입니까? 두 가지를 std :: map (Category_Name을 키로 사용)과 같이 저장하십시오. const QString &를 취하고 QComboBox의 currentIndexChanged (const QString &) 신호에 연결된 슬롯을 만듭니다. 슬롯 내부에서지도에서 키를 찾아 Category_ID를 가져옵니다. –

+0

사실 그것은 아마도 최선의 방법은 아닙니다. 그러나, 나는 그것이 당신이 일종의 조회를해야 할 때까지 생각한다. 그것이내는 유일한 것은 텍스트 또는 그것의 색인이기 때문이다. –

답변

1

좋아

덕분에, 지금 답을 제시합니다. :)

QComboBox* myBox = new QComboBox(); 
connect(myBox, SIGNAL(indexChanged(int)), this, SLOT(handleIndexChange(int))); 

void myObject::handleIndexChange(int /*index*/) { 
    // We actually don't need the index 
    QComboBox* box = qobject_cast<QComboBox*>(sender()); 
    if (box) { 
     QVariant data = box->currentData(); // do whatever w/ data... sounds like call toInt() in your case. 
    } 
} 

내 접근 방식의 세 가지의 본질은 변경 후 현재 항목에 해당하는 (데이터를 얻을 여분의 일을) 할 필요가 있다는 것입니다. 기본 데이터를 인수로 사용하는 신호가 나오면 값 비싼 것이 좋을 것입니다.

+0

데이터를 채울 indexChanged의 범주 이름을 기반으로 쿼리를 수행 할 수 있습니까? 또는 모든 데이터를 구문 분석하고 시작할 때 콤보 상자를로드하기 위해 populateCat 함수를 변경해야합니까? – Talon06

+0

저는 DBA가 아니기 때문에 더 많은 정보를 제공 할 수는 없지만 이미 캐시 된 데이터를 통한 조회와 비교할 때 DB 쿼리는 대개 느리고 (비싸지 만) 일반적으로 , 어쨌든. 실제로 많은 것들에 달려 있습니다. 레코드 수와 대기 시간 허용 오차가 주된 두 가지입니다. 또한 데이터베이스가 검색을 수행하는 속도 또는 속도를 고려해야합니다. –

+0

케이 감사합니다 내가 결정할 건물에있는 앱에 대해 조사하고 테스트해야 할 것입니다. – Talon06

관련 문제