2012-01-30 10 views
1

編集不可能なQComboBoxでは、いくつかのキーをすばやく押すと、表示されたテキストで検索が実行され、入力した接頭辞を持つ最初の項目が選択されます。たとえば、「アラバマ」、「アラスカ」、「カリフォルニア」、「コロラド」、「オハイオ」、「ルイジアナ」のコンボボックスに6つの項目があり、Cを押すと「カリフォルニア」が選択されます。しばらく待ってOを押すと、「Ohio」が選択されます。ただし、「CO」をすばやく入力すると、「Colorado」が選択されます。QComboBoxで検索をカスタマイズできますか?

この動作はQtの機能ですか?明らかに、これはGUIフレームワークの下にあるにもかかわらず、普遍的に機能します。これを処理するのがQtなら、それをカスタマイズできますか?私がやりたいことは、基本的にComboBoxに表示されていないデータに基づいて検索を実行することです。たとえば、ComboBoxでログインをリストするユーザーを選択するには、ユーザーの姓を入力して選択するだけで十分です。テキストの途中で一致するものを検索するだけで十分です(たとえば、「nia」と入力して「California」を選択するなど)。まず

、QCompleterは助けるように見えたが、これはウィジェットがこれを達成するために使用されるべきQComboBox、では不可能である場合は、それだけ...編集可能なQComboBoxに

を有用であろうように見えますか?

ご注意いただきありがとうございます。

答えて

1

サブクラスQComboBoxをサブタイプ化し、keyPressEventを再実装します。あなたのコンボボックスに、2つの引数を持つエントリを追加する関数を実装したとしましょう:ログイン名と実際の名前:

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

いいえ、そうではありません。私はちょうど既に存在していれば、車輪にreinventigを避けようとしていましたが、あなたが提案したように私はやります。ありがとう:) – Gabriel

関連する問題