QCompleter und Sonderzeichen

Alles rund um die Programmierung mit Qt
Antworten
Skatol
Beiträge: 2
Registriert: 28. Dezember 2008 15:43

QCompleter und Sonderzeichen

Beitrag von Skatol »

Hallo,

ich habe mir nach dem Custom Completer Beispiel eine Autovervollständigung gebaut, die auch soweit mit "normalen" Wörtern funktioniert. Wenn ich jedoch Ausdrücke mit Klammern ()[]{}, z.B. "[[Testfunktion", in der Wortliste verwende, werden diese von der Autovervollständigung ignoriert. Wie muss ich denn das Beispiel modifizieren, damit auch Ausdrücke, die Klammern enthalten, funktionieren?

Habe versucht die Klammern mit Backslash ("\\[\\[Testfunktion") zu escapen, jedoch ohne Erfolg. Zusätzlich habe ich die Klammern aus eow (Quellcode) entfernt , was jedoch auch nichts gebracht hat:

Code: Alles auswählen

static QString eow("~!@#$%^&*_+|:\"<>?,./;'\\-="); // end of word
Was habe ich denn im Code noch übersehen?
Skatol
Beiträge: 2
Registriert: 28. Dezember 2008 15:43

Beitrag von Skatol »

Hi,

niemand, der mir weiterhelfen kann? Zumindest ist mir in den letzten Tagen aufgefallen, dass sich das Completer-Popup schließt, sobald die Shift-, Strg-Taste etc. gedrückt wird. Das kann ich aus dem Code auch soweit nachvollziehen und deshalb kann man keine Sonderzeichen eintippen... Nun weiß ich leider trotzdem nicht weiter, wie ich den Code verändern muss, damit die Eingabe von Klammern bei der Codevervollständigung funktioniert und das Popup offen bleibt. Weiß da jemand weiter?

Code: Alles auswählen

 void TextEdit::keyPressEvent(QKeyEvent *e)
 {
     if (c && c->popup()->isVisible()) {
         // The following keys are forwarded by the completer to the widget
        switch (e->key()) {
        case Qt::Key_Enter:
        case Qt::Key_Return:
        case Qt::Key_Escape:
        case Qt::Key_Tab:
        case Qt::Key_Backtab:
             e->ignore();
             return; // let the completer do default behavior
        default:
            break;
        }
     }

     bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E
     if (!c || !isShortcut) // do not process the shortcut when we have a completer
         QTextEdit::keyPressEvent(e);

     const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier);
     if (!c || (ctrlOrShift && e->text().isEmpty()))
         return;

     static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
     bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift;
     QString completionPrefix = textUnderCursor();

     if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3
                       || eow.contains(e->text().right(1)))) {
         c->popup()->hide();
         return;
     }

     if (completionPrefix != c->completionPrefix()) {
         c->setCompletionPrefix(completionPrefix);
         c->popup()->setCurrentIndex(c->completionModel()->index(0, 0));
     }
     QRect cr = cursorRect();
     cr.setWidth(c->popup()->sizeHintForColumn(0)
                 + c->popup()->verticalScrollBar()->sizeHint().width());
     c->complete(cr); // popup it up!
 }
Antworten