2014-06-11 4 views
0

정답을 입력하지 않고 웹을 검색 한 후 많은 도움을 얻었습니다 ... 내가 설명 할 수 있는지 보도록하겠습니다.QCompleter, 데이터베이스에서 ID를 얻는 방법

QT5를 사용하는 UI에서 작업 중이며 자동 완성 기능으로 행을 편집하고 싶습니다. 나는 Qcompleter를 사용할 수 있다는 것을 알고 있으며, 잘 작동한다. Qrypleter를 Qrypleter로 채운다. 하지만 그 분야의 ID를 알아야합니다.

예를 들어

:

나는 제품 _와 PRODUCT_CODE있는 데이터베이스에 질의를하고 있어요 경우

, 사용자가 prodcut의 이름을 입력하고 내가 채우 각이 없더라도, 이벤트에있는 새로운 데이터로 QCompleter 하지만 사용자가 제품을 선택하면 코드를 다른 위치에 표시하려고합니다. 물론 동일한 이름이지만 코드가 다른 두 개 이상의 제품이있을 수 있으므로 검색 후 코드를 찾을 수 없습니다.

그래서 QCompleter에는 두 개의 realted 필드가있는 방법이 있습니까?

QTableWidget을 코드가있는 숨겨진 열로 이미 만들고 (Qcompleter를 시뮬레이트하기 위해) QlineEdit의 하단에 바로 표시하려고합니다. 그러면 모양이 좋아서 작동하지만 ... 잘 모르겠다. Qcompleter와 같은 기능을 추가하는 방법, 화살표 아래쪽 화살표가 테이블로 점프하여 lineedit lostfocus 일 때 사라지게하지만, 테이블을 선택하면 사라집니다.

도움이 될 것입니다! 이것을 읽으면서 시간을내어 주셔서 감사하고 나쁜 영어에 대해 유감스럽게 생각합니다! 자동 완성 조치를 잡으려고 그런

QMap<int, QString> data; 
data[0] = "Moscow"; 
data[1] = "London"; 
data[2] = "Paris"; 

QCompleter *completer = new QCompleter(this); 

QStandardItemModel *model = new QStandardItemModel(completer); 
QMapIterator<int, QString> it(data); 
while (it.hasNext()) 
{ 
    it.next(); 

    int code = it.key(); 
    QString name = it.value(); 

    QStandardItem *item = new QStandardItem; 
    item->setText(name); 
    item->setData(code, Qt::UserRole); 

    model->appendRow(item); 
} 

completer->setModel(model); 

당신이 QCompleter에 연결 activated(const QModelIndex &index) 신호를 추가 데이터를 표시 당신이 원하는 :

답변

1

당신은 completer 모델에 추가 데이터를 유지할 수 있습니다

connect(completer, SIGNAL(activated(QModelIndex)), 
      this, SLOT(onItemActivated(QModelIndex))); 

void Widget::onItemActivated(const QModelIndex &index) 
{ 
    int code = index.data(Qt::UserRole).toInt(); 

    codeEdit->setText(QString::number(code)); 
} 

그러나이 방법은 원 사용자가 자동 ​​완성을 사용하지 않고 전체 문자열을 입력하면 작동하지 않습니다. 이 경우 DB에 동일한 이름의 레코드가 두 개 이상있는 경우 올바른 코드 ID를 얻을 수 없습니다.

검색 필드를 만들려는 경우 모든 데이터를 일부 테이블보기에 표시하고 QSortFilterProxyModel을 사용하여 사용자 입력과 일치하는 레코드를 줄 편집에 표시하는 것이 좋습니다.