2012-01-30 4 views
1

편집 할 수없는 QComboBox에서 일부 키를 빠르게 누르면 표시된 텍스트에서 검색이 수행되고 입력 한 접두사가있는 첫 번째 항목이 선택됩니다. 예를 들어, "알라바마", "알래스카", "캘리포니아", "콜로라도", "오하이오"및 "루이지애나"콤보 상자에 6 개의 항목이 있고 C 키를 누르면 "캘리포니아"가 선택됩니다. 잠시 기다렸다가 O를 누르면 "Ohio"가 선택됩니다. 그러나 "CO"를 빨리 입력하면 "Colorado"가 선택됩니다.QComboBox에서 검색을 사용자 정의 할 수 있습니까?

이 동작은 Qt 기능입니까? 외관상으로는 GUI 프레임 워크가 있음에도 불구하고 보편적으로 작동합니다. 이것을 처리하는 Qt라면, 그것을 커스터마이징 할 수 있습니까? 기본적으로 ComboBox에 표시되지 않는 데이터를 기반으로 검색을 수행하려고합니다. 예를 들어 ComboBox에서 로그인을 나열하는 사용자를 선택하려면 사용자의 성을 입력하여 선택하면됩니다. 텍스트 가운데에서 일치하는 항목을 검색하는 것만으로도 충분합니다 (예 : "nia"를 입력하여 "캘리포니아"를 선택). 처음에는

는 QCompleter 도움 듯하지만, 그것은 단지 편집 가능한 QComboBox에 유용 할 것처럼는이를 달성하는 데 사용되어야하는 위젯, QComboBox와 함께 할 수없는 경우 ...

보이는?

감사합니다.

답변

1

서브 클래스 QComboBox을 사용하고 keyPressEvent을 다시 구현하십시오. 콤보 상자에 로그인 이름과 실제 이름이 포함 된 항목을 추가하는 함수를 구현했다고 가정 해 봅시다.

void MyComboBox::addEntry(QString loginName, QString name) 
{ 
    addItem(loginName); 
    // Store the name in a member variable, eg a map between names and login names 
    namesMap.insert(name, loginName); 
} 

void MyComboBox::keyPressEvent(QKeyEvent *evt) 
{ 
    QString currentString = ebt->text(); 
    if (currentString.isEmpty()) 
    { 
     QComboBox::keyPressEvent(evt); 
     return; 
    } 

    // Iterate through the map and search for the given name 
    QMapIterator<QString, QString> it(namesMap); 
    while(it.hasNext()) 
    { 
     it.next(); 
     QString name = it.key(); 
     if (name.contains(currentString)) 
     { 
      // it.value() is the login name corresponding to the name 
      // we have to find its index in the combo box in order to select it 
      int itemIndex = findText(it.value()); 
      if (itemIndex >= 0) 
       setCurrentIndex(itemIndex); 
      return; 
     } 
} 
+0

흠, 구현이 간단합니다. 이전에 상상 한 문제는 KeyEvent가 마지막으로 누른 키만 전송한다고 생각했기 때문에 새 검색을 시작할지 아니면 마지막 검색을 계속할지 결정하기 위해 이벤트가 처리 된 마지막 시간을 유지해야합니다. 귀하의 대답을 통해, 나는 키 스트로크 간격이 충분히 짧을 때 이벤트가 완전한 타이핑 된 텍스트를 가질 것이라는 것을 이해합니다. 이게 옳은 거니? – Gabriel

+0

이벤트의 타임 스탬프를 유지하고 문자열을 점진적으로 작성해야합니다. 그러나 이것은 구현하기가 어렵지 않습니다. – pnezis

+0

아니에요. 나는 이미 존재했다면 다시 바퀴를 피하려고했지만, 당신이 제안한대로 할 것입니다. 감사 :) – Gabriel

관련 문제