2016-12-20 3 views
0

Ich habe eine QComboBox mit einigen Daten gefüllt. Ich möchte das LineEdit der ComboBox bearbeiten und wenn ich das mache, um die ComboBox sein PopUp anzuzeigen, während ich bearbeite. Das Problem ist, dass ich den Fokus der Zeile Edit verloren habe und ich kann immer nur einen Buchstaben schreiben.QComboBox bearbeiten LineEdit während PopUp aktiv ist

Dies ist, was ich in einer trivialen Ebene tue:

ui->comboBox->addItem("This"); 
ui->comboBox->addItem("is"); 
ui->comboBox->addItem("a"); 
ui->comboBox->addItem("comboBox"); 

ui->comboBox->setEditable(true); 
connect(ui->comboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(PrintTextLineEdit(QString))); 

void MainWindow::PrintTextLineEdit(QString str) 
{ 
    ui->comboBox->showPopup(); 
    ui->comboBox->lineEdit()->setFocus(); 
} 

Auch wenn ich die blockSignal auf dem LineEdit verwenden, während ich die popUp ist nutzlos zeigen. Irgendwelche Vorschläge?

EDIT

Es scheint, dass ich etwas mehr Detail zur Verfügung stellen müssen. Ich muss in der Lage sein, ein ganzes Wort auf einmal zu schreiben, ohne den Fokus zu verlieren, wenn ich ui->comboBox->showPopUp() im currentTextChanged Signal verwende.

Oder um es einfach zu sagen: der Cursor muss nicht aus dem QLineEdit verschwinden, nachdem das Signal ausgegeben wurde und das PopUp angezeigt wird.

+0

Welche Art von Verhalten versuchen Sie tatsächlich zu implementieren? Eine Art Drop-Down-Vorschlagsliste? – Tomas

+0

Eine Art von Filter, aber ohne Proxy oder eine benutzerdefinierte Liste. Mein Problem ist, ich möchte, dass ich ein Wort mit dem PopUp öffnen kann. – student

Antwort

1

Sie müssen Ihre eigene Kombinationsfeldklasse von QComboBox ableiten und die virtuelle Methode showPopup() überschreiben, um den Fokus wieder auf die Linienbearbeitung zurückzusetzen.

void CMyComboBox::showPopup() 
{ 
    QComboBox::showPopup(); 

    // Put the focus back later, after all pending events are processed. 
    QTimer::singleShot(0, [this](){ lineEdit()->setFocus(); }); 
} 

Als Sonderfall, ein QTimer mit einem Timeout von 0 wird so bald wie alle Ereignisse im Fenster-System-Ereigniswarteschlange verarbeitet worden Timeout.

EDIT:

Dies funktioniert (obwohl man das als ein Hack in Erwägung ziehen könnte):

class CMyComboBox : public QComboBox 
{ 
    public: 
    CMyComboBox(QWidget* parent) 
     : QComboBox(parent) 
    { 
     view()->installEventFilter(this); 
    } 

    // Event filter forwards view key events to the line edit. 
    bool eventFilter(QObject *watched, QEvent *event) 
    { 
     if (event->type() == QEvent::KeyPress) 
     { 
     QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); 
     QKeyEvent* newEvent = new QKeyEvent(keyEvent->type(), keyEvent->key(), keyEvent->modifiers(), 
              keyEvent->text(), keyEvent->isAutoRepeat(), keyEvent->count()); 

     QFocusEvent* focusEvent = new QFocusEvent(QEvent::FocusIn, Qt::OtherFocusReason); 
     QCoreApplication::postEvent(lineEdit(), focusEvent); 
     QCoreApplication::postEvent(lineEdit(), newEvent); 
     } 

     return false; 
    } 
}; 

Aber persönlich, würde ich wahrscheinlich ein abgetrenntes QMenu zur Anzeige Wortliste verwenden, nicht das Popup-Menü des Kombinationsfelds.

+0

Dies erzeugt keine sichtbaren Effekt weder :( – student

+0

Sorry für falsche Antwort. Ich habe eine andere Lösung basierend auf Ereignisfilter gefunden. – Tomas

+0

Dies ist perfekt. Vielen Dank. – student

3

Jede Combobox hat eine Standardeinstellung QCompleter, die Abschlussoptionen im Popup anzeigen kann. Ich denke, Sie können erreichen, was Sie wollen, indem Sie diesen Completers-Modus auf PopupCompletion setzen.

ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion); 

In diesem Fall zeigt die Combobox während der Eingabe übereinstimmende Auswahlen an. Wenn Sie möchten, dass es alle Elemente der Combobox auflistet, sollten Sie einen benutzerdefinierten QCompleter implementieren, der alle Elemente unabhängig von den Benutzertypen abgleicht.

+0

Leider suche ich nicht danach. Ich muss nur ein ganzes Wort eingeben, wenn das PopUp geöffnet ist. – student

0

Als ich im Code von QComboBox aussehen i die folgenden in der showpopup Code sehen:

container->show(); 
container->updateScrollers(); 
view()->setFocus(); // <<-- focus command here 

view()->scrollTo(view()->currentIndex(), 
       style->styleHint(QStyle::SH_ComboBox_Popup, &opt, this) 
         ? QAbstractItemView::PositionAtCenter 
         : QAbstractItemView::EnsureVisible); 

Also vielleicht, wenn Sie die folgende (nicht getestet hier) haben Sie vielleicht das Ergebnis erhalten Sie wollen:

ui->comboBox->addItem("This"); 
ui->comboBox->addItem("is"); 
ui->comboBox->addItem("a"); 
ui->comboBox->addItem("comboBox"); 

ui->comboBox->setEditable(true); 
ui->comboBox->view()->setFocusPolicy(Qt::FocusPolicy::NoFocus); // don't allow focusing of the view of the popup 
connect(ui->comboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(PrintTextLineEdit(QString))); 

void MainWindow::PrintTextLineEdit(QString str) 
{ 
    ui->comboBox->showPopup(); 
    ui->comboBox->lineEdit()->setFocus(); 
} 

einen Versuch wert.

+0

Dies schien keinen sichtbaren Effekt zu erzeugen :( – student

+0

Oh, warte, du versuchst dies auf dem QLineEdit der Combobox selbst? Das ist eingebaute Funktionalität. Entferne deinen 'currentTextChanged' Signal Slot und benutze @heyYo seine Methode. – Stormenet

+0

Nein, ich versuche etwas in den QLineEdit der comboBox zu schreiben und wenn ich das mache, brauche ich das PopUp, ich habe diese Frage nur deswegen und nicht mehr geöffnet.In der aktuellen Situation jedes Mal wenn ich einen Brief schreibe Das popUp wird angezeigt und ich kann nicht weiter in QLineEdit schreiben .. – student

Verwandte Themen